1. 程式人生 > >初學Qt之--在C++程式中使用C函式

初學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);
  }
  
}

   

如上的解決方法可能不好,但是編譯器沒有報錯,姑且暫時可行吧。

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