Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt 5.5.1:在模板中使用qDebug()_C++_Qt - Fatal编程技术网

C++ Qt 5.5.1:在模板中使用qDebug()

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

我有以下问题:

我正在使用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-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,因此这可能不是因为模板。你能给我们一个简单的错误代码,然后我们将能够测试它。