qt调试时怎样打印出被qt 调用c语言函数函数的名称

3036人阅读
因qt QWidget有QWidget::close()函数,与系统调用函数close同名,这是qt设计不好的地方,因此在QWidget派生类函数中调用close系统调用就要使用全局域符号“::”。
当时我出问题的代码如下:
void ButtonWindow::mousePressEvent ( QMouseEvent * e )//鼠标单击事件响应
&std::cout && &mouse clicked!\n&;
&bfd = open(&/dev/Buzzer&, 0);
&if (bfd!=-1)
&&printf(&open '/dev/Buzzer success!'\n&);
&&printf(&open '/dev/Buzzer fail!'\n&);
&&printf(strerror(errno));
&rt = close(bfd); //注意此处使用错误,未加全局域符号,默认调用ButtonWindow::close函数,应改为rt=::close(bfd)
&printf(&close:rt=%d\n&, rt);
&printf(&close '/dev/Buzzer'!\n&);
当时发现很奇怪,close函数总是返回1,与标准close函数返回值不符,且调用此句函数后,qt线程变为了僵尸线程。后来猛然发现qt QWidget有QWidget::close()函数,这也就能解释为什么qt界面没有了,并成为僵尸线程了。这个问题我找了一天多,最后总算找到了。在此做下记录,希望也能给遇到同样问题的朋友提供参考吧。
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:43653次
排名:千里之外
原创:16篇
评论:11条
(1)(1)(1)(1)(2)(1)(3)(3)(1)(1)(1)C/C++(44)
转载出处:
今天跟踪一段开源代码的时候,因为对代码不太熟悉,所以要打印一些关键的信息。便顺手整理了一下这个能打印文件名、行号、函数名的宏。
1、打印文件名、行号、函数的两种方式
/**************************************************************************
@Copyright (c) 2013, ChenMH, All rights reserved.
: main.cpp
: 打印文件名、行号、函数名的方法。
**************************************************************************/
#include &cstdio&
//定义打印宏,并在打印信息前加入文件名、行号、函数名
//此宏展开后,类似于printf(&123&),printf(&456&);
#define TRACE_CMH_1 (printf(&%s(%d)-&%s&: &,__FILE__, __LINE__, __FUNCTION__), printf)
//此宏展开后,类似于printf(&%d&&%d&, 1, 2);
#define TRACE_CMH_2(fmt,...) \
printf(&%s(%d)-&%s&: &##fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__)
//注:由于第一个宏TRACE_CMH_1调用了两次printf,所以效率没有第二个宏高。
//如果编译器支持C99标准的话,可以用第二个宏。
int count = 1;
class CBase
//打印当前行所在文件、行号、函数,以及其它信息。
TRACE_CMH_2(&BASE: [%d]\n&, count++);
class CSub : public CBase
//打印当前行所在文件、行号、函数,以及其它信息。
TRACE_CMH_1(&SUB: [%d]\n&, count++);
int main(int argc, char **argv)
2、在项目中使用
/********************************************************
: 定义调试打印宏
********************************************************/
#define _DEBUG_TRACE_CMH_ 2
#if 0 != _DEBUG_TRACE_CMH_
#include &cstdio&
#if 1==_DEBUG_TRACE_CMH_ //普通打印
#define TRACE_CMH printf
#elif 2==_DEBUG_TRACE_CMH_ //打印文件名、行号
#define TRACE_CMH(fmt,...) \
printf(&%s(%d): &##fmt, __FILE__, __LINE__, ##__VA_ARGS__)
#elif 3==_DEBUG_TRACE_CMH_ //打印文件名、行号、函数名
#define TRACE_CMH(fmt,...) \
printf(&%s(%d)-&%s&: &##fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__)
#define TRACE_CMH
#endif //_TRACE_CMH_DEBUG_
/*******************************************************/
这段代码中用到了这几个宏:
  1) __VA_ARGS__&& 是一个可变参数的宏,这个可宏是新的C99规范中新增的,目前似乎gcc和VC6.0之后的都支持(VC6.0的编译器不支持)。宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的&,&去掉的作用。
  2) __FILE__&&& 宏在预编译时会替换成当前的源文件名
  3) __LINE__&& 宏在预编译时会替换成当前的行号
  4) __FUNCTION__&& 宏在预编译时会替换成当前的函数名称
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:46098次
排名:千里之外
转载:190篇
(1)(1)(3)(1)(20)(18)(5)(3)(4)(12)(32)(36)(8)(21)(1)(14)(1)(5)(4)(2)18:16 提问
求教QT中一个类的函数怎样才能调用另一个类的函数
在fivescene.h文件中已经声明class FiveScene : public QWidget;
然后UI中的Widget也是服从这个类的调用;
我想在让mainwndow.h(头文件中已经include)负责整个界面上的按钮的操作,然后有个重新开始的按钮clicked(),我希望使得Widget界面清空;
但在实际操作中,并没有调用到FiveScene类下面的init()函数,求教应该怎么变动
(编译已通过,部分相关代码如下)
mainwindow.h(已经#include "fivescene.h")
namespace Ui {
class MainW
class FiveS
class MainWindow : public QMainWindow
{……private:FiveScene *a;……}
mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
ui-&setupUi(this);
a = new FiveScene();
void MainWindow::on_pushButton_1_clicked()
a-&init();
在fivescene.h中已经声明init();在fivescene.cpp中也已经实现并且没有问题
按赞数排序
什么叫没有调用,是没有编译成功还是点了没有反应?在void MainWindow::on_pushButton_1_clicked()下断点看看。
获取对应类的对象指针等,然后传递给需要的地方,然后再调用指针方法。
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!
其他相似问题QT创建与调用Dll方法(包括类成员)--显式调用 - 推酷
QT创建与调用Dll方法(包括类成员)--显式调用
看网上的好多关于QT调用Dll的方法,大部分都是调用函数的,并没有调用C++类成员的情况,即使是有,比如说:
---(这一篇里没有调用类成员的)
我就是按照这上面的教程一步步做的,可惜了都没成功~~~这里面都有一个最重要的步骤没有说清楚(可能怪我笨~~),路径问题!!!
所以这里自我做一下总结:
创建时选择C++ Library就可以了,然后选择Shared Library(共享库),其他默认OK。
创建好后文件如下(我这里工程名为:dll)
其中dll.pro代码为:
TARGET = dll
TEMPLATE = lib
DEFINES += DLL_LIBRARY
SOURCES += \
HEADERS +=\
dll_global.h \
target.path = /usr/lib
INSTALLS += target
dll_global.h代码为:
#ifndef DLL_GLOBAL_H
#define DLL_GLOBAL_H
#include &QtCore/qglobal.h&
#if defined(DLL_LIBRARY)
# define DLLSHARED_EXPORT Q_DECL_EXPORT
# define DLLSHARED_EXPORT Q_DECL_IMPORT
#endif // DLL_GLOBAL_H
dll.h代码为:
#ifndef DLL_H
#define DLL_H
#include &string&
#include &dll_global.h&
using namespace
class DLLSHARED_EXPORT Dll
void Print();
string GetStrAdd(string str1, string str2);
extern &C& {
DLLSHARED_EXPORT Dll* getDllObject(); //获取类Dll的对象
DLLSHARED_EXPORT void releseDllObject(Dll*); //获取类Dll的对象
DLLSHARED_EXPORT void helloWorld();
DLLSHARED_EXPORT int add( int a, int b);
#endif // DLL_H
dll.cpp代码为:
#include &dll.h&
#include &iostream&
Dll::Dll()
std::cout&& &New Dll Object !& &&
Dll::~Dll(){
std::cout&& &Dll Object Des~~& &&
void Dll::Print ()
std::cout&& &Dll::Print !& &&
string Dll::GetStrAdd (string str1, string str2)
string s=str1+str2;
std::cout&& &Dll::GetStrAdd-&return-&& &&s&&
return (s);
void helloWorld()
std::cout && &GlobalFun-&hello,world!& &&
int add( int a, int b)
std::cout&& &GlobalFun-&add-&return-&& &&(a+b)&&
return a +
Dll* getDllObject()
return new Dll();
void releseDllObject(Dll* dll){
运行后在生成目录里生成了dll.dll、libdll.a、dll.o三个文件(Windows下使用MinGW编译运行),如图:
新建一个调用项目”DllTest“:
将dll.h和 dll_global.h两个文件放到代码目录中:
其中DllTest.pro代码如下:
greaterThan(QT_MAJOR_VERSION, ): QT += widgets
TARGET = DllTest
TEMPLATE = app
SOURCES += main.cpp
LIBS +=dll.dll #很重要!路径设置问题,如果错了就没有如果了~~~
LIBS +=”D:/API/dll.dll&
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = DllTest
TEMPLATE = app
SOURCES += main.cpp
LIBS +=dll.dll #很重要!路径设置问题,如果错了就没有如果了~~~
main.cpp代码:
#include &iostream&
#include &QLibrary&
#include &dll.h& //头文件还是需要加的,否则无法解析Dll类
typedef Dll* (*CreatDll)(); //定义函数指针,获取类Dll对象;
typedef bool (*ReleseDll)(Dll*);
typedef void (*fun)();
int main( )
// QCoreApplication a(argc, argv);
QLibrary mylib( &dll.dll& );
//声明所用到的dll文件
//判断是否正确加载
if (mylib.load())
std::cout && &DLL loaded!& &&std::
CreatDll creatDll = (CreatDll)mylib.resolve( &getDllObject& );
ReleseDll decDll=(ReleseDll)mylib.resolve ( &releseDllObject& );
fun hello=(fun)mylib.resolve ( &helloWorld& );
if (hello)hello();
if (creatDll&&decDll)
Dll *testDll = creatDll();
testDll-&GetStrAdd ( &abc& , &ABD& );
testDll-&Print ();
decDll(testDll);
//加载失败
std::cout && &DLL is not loaded!& &&std::
// return a.exec();
mylib.unload ();
//输出为:
DLL loaded!
GlobalFun-&hello,world!
New Dll Object !
Dll::GetStrAdd-& return -&abcABD
Dll::Print !
Dll Object Des~~
将dll.dll文件放到调用项目的生成目录下(Debug上面一层 )
即DllTest-Debug(我这里是这个名字,你那里可能不同 )目录下:
编译,运行,OK!
这里要特别注意dll.dll的存放位置,还有要在.pro文件中增加一个&LIBS += dll.dll&用来指示路径,也可使用绝对路径如先将dll.dll放到D:/API/下,则应该设置为:LIBS += &D:/API/dll.dll&
如果想在资源管理器中直接双击exe文件打开,则dll.dll要放到和exe同目录下!
这个是显式调用的方法!
说明:下载的代码下载好后,要将 LIBS +=&&D:/API/dll.dll& 更改成: LIBS += dll.dll 就可直接运行了。
(项目DllTest.pro)
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致}

我要回帖

更多关于 qt调用c函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信