初学Qt之--在C++程序中使用C函数

        今天碰到了需要在C++中使用C函数的问题,原先我以为直接在C++中引入C需要的头文件,然后在C++中使用相关的C函数就可以了,可是今天真试了一下却发现编译器报错:"xxxx"在此作用域中尚未声明。费了好大劲才在网上找到了答案,原来要使用extern关键字来指明这个函数的出处。

        本人语言表达能力不行,话不多说,直接上代码(注:这个代码仅供参考,可能无法运行):

/********MyButton.h*********/

#ifndef MYBUTTON_H_
#define MYBUTTON_H_

#include<iostream>
#include <QtGui/QPushButton>
#include <QtGui/QWidget>

class MyButton : public QPushButton
{
  Q_OBJECT
public:
  MyButton(const QString & text, QWidget * parent);
  ~MyButton();
 public:
 void setLed(int argc, char *argv[]);
 
public slots:
  void sendButtonText(); 
private:
  signals:
  void isClickButton(const QString &text);
};

#endif


/**********MyButton.cpp************/

#include "MyButton.h"
 

extern "C"{
 
   #include <stdio.h>
   #include <stdlib.h>
   #include <unistd.h>
   #include <sys/ioctl.h>
   #include<sys/types.h>
   #include<sys/stat.h>
   #include<fcntl.h>
   
   void MyButton::setLed(int argc, char *argv[]){
   int on;
	int led_number;
	int fd;
	if (argc != 3 || sscanf(argv[1], "%d", &led_number) != 1 || sscanf(argv[2],"%d", &on) != 1 ||
	    on < 0 || on > 1 || led_number < 0 || led_number > 3) {
		fprintf(stderr, "Usage:\n");
		fprintf(stderr, "\t led led_number on|off\n");
		fprintf(stderr, "Options:\n");
		fprintf(stderr, "\t led_number from 0 to 3\n");
		fprintf(stderr, "\t on 1 	off 0\n");
		exit(1);
	}
	fd = open("/dev/led", 0);
	if (fd < 0) {
		perror("open device /dev/led");
		exit(1);
	}
	ioctl(fd, on, led_number);
	::close(fd);  //请注意,此处如果要调用C语言库中的close()一定要加上“::",否则程序将到当前类的作用域中寻找close()方法,导致不明错误。
    }
}



MyButton::MyButton(const QString &text,QWidget *widget)
:QPushButton(text,widget)
{
  connect(this,SIGNAL(clicked()),this,SLOT(sendButtonText()));
}

MyButton::~MyButton()
{
}

void MyButton::sendButtonText(){
  emit isClickButton(this->text());
  char open_1[]="1";
  char open_2[]="1";
  char open_3[]="1";
  
  char *o1=open_1;
  char *o2=open_2;
  char *o3=open_3;
  
  char close_1[]="1";
  char close_2[]="1";
  char close_3[]="0";
  
  char *c1=close_1;
  char *c2=close_2;
  char *c3=close_3;
 
  char *open[]={o1,o2,o3};
  char *close[]={c1,c2,c3};
  

  QString *str=new QString(this->text());
  if((str->compare("mb1"))==0){
     std::cout<<"mb1 is clicked!\n";
     setLed(3,open);
  }
  if((str->compare("mb2"))==0){
     std::cout<<"mb2 is clicked!\n";
     setLed(3,close);
  }
  
}

   

如上的解决方法可能不好,但是编译器没有报错,姑且暂时可行吧。

(--------完--------)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值