初學Qt之--在C++程式中使用C函式
阿新 • • 發佈:2019-02-18
今天碰到了需要在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); } }
如上的解決方法可能不好,但是編譯器沒有報錯,姑且暫時可行吧。
(--------完--------)