C++ Qt 5.5.1:在模板中使用qDebug()
我有以下问题: 我正在使用Qt5.5.1,并使用qDebug()函数通过内部消息(qInstallMessageHandler)处理程序生成日志文件。在此消息处理程序中,有一个特定的消息模式:C++ Qt 5.5.1:在模板中使用qDebug(),c++,qt,C++,Qt,我有以下问题: 我正在使用Qt5.5.1,并使用qDebug()函数通过内部消息(qInstallMessageHandler)处理程序生成日志文件。在此消息处理程序中,有一个特定的消息模式: [%{time yyyy-MM-dd h:mm:ss.zzz} %{if-debug}DBG%{endif}%{if-info}INF" "%{endif}%{if-warning}WRN%{endif}%{if-critical}CRT%{endif}%{if-f
[%{time yyyy-MM-dd h:mm:ss.zzz} %{if-debug}DBG%{endif}%{if-info}INF"
"%{endif}%{if-warning}WRN%{endif}%{if-critical}CRT%{endif}%{if-fatal}FTL%{endif} %{category}]"
" %{file}:%{line} - %{message}
这会产生如下消息:
[2017-07-17 13:52:57.934 INF default] ..\..\..\file.cpp:146 - OutputTxt
通常,应该有一个具有相对路径的输出,但有些消息具有绝对路径。我发现在模板函数中使用qDebug()会导致绝对路径出现“问题”
有人知道我如何在模板函数中使用qDebug(),以便在消息处理程序中拥有相对路径吗?
提前谢谢 实际生成日志消息。从:
qDebug()
扩展为QMessageLogger(\uuuuu文件、线、函数信息)。debug()
用于调试版本,而QMessageLogger(0、0、0)。debug()
用于发布版本
这有两个后果:
\uuuuu file\uuuu
宏的扩展。该文件路径是相对路径还是绝对路径可能取决于编译器的预处理器\uuuu文件
预处理器宏,可以这样说:
此宏以C字符串常量的形式扩展为当前输入文件的名称。这是预处理器打开文件的路径,而不是“#include”中指定的短名称或作为输入文件名参数。例如,“/usr/local/include/myheader.h”可能是此宏的扩展
有了这些信息,下面是一个简单的示例,说明了为什么从模板函数调用Qt的调试函数可能会打印绝对路径:
File: /var/tmp/warn.h Message: OutputTxt
Macro __FILE__ expands to: /var/tmp/warn.h
File: /var/tmp/warn.h Message: OutputTxt
Macro __FILE__ expands to: /var/tmp/warn.h
警告
但是如果我们将warn.h
移动到另一个目录(/var/tmp
),并将文件的新位置添加到.pro文件中:
INCLUDEPATH += /var/tmp/
我们通过绝对路径获得此输出:
File: /var/tmp/warn.h Message: OutputTxt
Macro __FILE__ expands to: /var/tmp/warn.h
File: /var/tmp/warn.h Message: OutputTxt
Macro __FILE__ expands to: /var/tmp/warn.h
类似地,如果我们使用main.cpp中的绝对路径而不是附加到INCLUDEPATH
中的模板函数包含头文件:
#include "/var/tmp/warn.h"
我们还使用绝对路径获得输出:
File: /var/tmp/warn.h Message: OutputTxt
Macro __FILE__ expands to: /var/tmp/warn.h
File: /var/tmp/warn.h Message: OutputTxt
Macro __FILE__ expands to: /var/tmp/warn.h
因此,虽然这可能只是编译器预处理器的一个怪癖,但也可能是如何包含包含模板函数的头文件。如果未使用绝对路径显式包含此头文件,则可以检查qmake生成的Makefile的
INCPATH
变量,以查看是否存在绝对包含路径。可以在模板函数中使用qDebug,因此这可能不是因为模板。你能给我们一个简单的错误代码,然后我们将能够测试它。