Qt创建者:如何在qDebug中将函数名称显示为字符串

时间:2014-01-07 10:14:51

标签: c++ qt

在头文件中:

#define PRINTTCNAME(tcName)\
        qDebug() << Q_FUNC_INFO;   // error
#define RUNTC( tc)\
        PRINTTCNAME(tc);\
        res = tc();\
         if(res == false){ \
          TC_clean(); \      
        }

在main.cpp中:

int TC1_Send();
int TC2_Receive();

int main(int argc, char *argv[]){
    RUNTC(TC1_Send);
    RUNTC(TC2_Receive);
}

问题:如果我使用上面的代码,它将打印int main(int, char**)的函数名称,这不是我想要的。 我想打印测试用例的名称,例如TC1_SendTC2_Receive ..

我该如何处理?

3 个答案:

答案 0 :(得分:2)

我认为你的主要困惑是你认为这应该是你正在做的功能。

不是。当宏的内容被放置在发生“invokation”的地方时,宏正在经历预处理器步骤。

在预处理器执行之后的那个上下文中,代码周围的这个函数将是主要的,所以这是一种预期的行为。

在这种特殊情况下,只需使用以下内容:

#define PRINTTCNAME(tcName)\
    qDebug() << #tcName"()";   // no error

输出将是:

TC1_Send()
TC2_Receive()

答案 1 :(得分:1)

使用__FUNCTION__代替`Q_FUNC_INFO,它对我有用。

正确使用:

#define NAME __FUNCTION__

void test()
{
    qDebug() << NAME;
}


int main()
{
    qDebug() << NAME;
    test();
    return 0;
}

输出将是:

  

     

测试

proof

您的代码应为:

在头文件中:

#include <QDebug>

#define PRINTTCNAME(tcName) qDebug() << Q_FUNC_INFO;
void RUNTC(int tc)
{
        PRINTTCNAME(tc);
        res = tc();
        if(res == false)
            TC_clean();  
}

的main.cpp

int TC1_Send;
int TC2_Receive;

int main(int argc, char *argv[]){
    RUNTC(TC1_Send);
    RUNTC(TC2_Receive);
}

答案 2 :(得分:0)

我用: -

  __func__ 

将此作为大多数功能的顶部: -

Log(QString("<< %1::%2 >>").arg(metaObject()->className()).arg(__func__));

Log函数调用qDebug,但可以同样输出到其他位置,例如文件或系统日志。

metaObject() - &gt; className()返回类的名称,因此如果您正在使用类函数,则可以使用它。