如何更改宏函数参数展开顺序

How to change macro function argument expansion ordering?

本文关键字:顺序 参数 函数 何更改      更新时间:2023-10-16

我有以下代码:

#include <iostream>
#include <stdexcept>
#define TRACE_MACRO(EnterText) 
class CTrace 
{ 
public: 
CTrace() 
{ 
std::cout << EnterText;  
} 
private:
};
#define DO_TRACE TRACE_MACRO("[ENTER] " __FUNCTION__ "rn") CTrace trace
static void test()
{
    DO_TRACE;
}
int main(int, char**)
{
    DO_TRACE;
    test();
    return 0;
}

哪个输出:

[ENTER] main::CTrace::CTrace
[ENTER] test::CTrace::CTrace

如何编写宏,使__FUNCTION__首先展开,使输出变为:

[ENTER] main
[ENTER] test

我试图创建一个名为DO_TRACE2的子宏来转发参数,但这会产生相同的输出。

如果这是不可能的,那么一个宏会在编译时将文本的子字符串去掉字符串的CTrace::CTrace部分呢?

编辑:请注意,我不想将指向编译时字符串的指针传递给这个类,我希望对std::cout的调用看起来就像我实际上手动编写了std::cout<lt;"main";

未测试,但这里有一个可能有效的简单重排:

#define TRACE_MACRO 
class CTrace 
{ 
public: 
CTrace(const char* text) 
{ 
std::cout << text;  
} 
private:
};
#define DO_TRACE TRACE_MACRO CTrace trace("[ENTER] " __FUNCTION__ "rn")

Jimmy问

有必要在宏def中定义一个全新的类吗?

你回答说:

@吉米没有,我只是想用const调用std::cout静态编译时字符串,而不是指向编译时的指针字符串,如果有意义的话。

那么,为什么不放弃这门课呢:

#define DO_TRACE std::cout << "[ENTER] " << __FUNCTION__ << "rn"

这将输出:

[ENTER] main 
[ENTER] test

并使用const静态编译时字符串。。。。

我可能错过了什么,告诉我,我会删除这篇帖子。。。。

顺便说一句,我使用GNUGCC版本4.8.1编译了你的文章中的代码http://www.compileonline.com/compile_cpp_online.php.输出

[ENTER] CTrace 
[ENTER] CTrace

看起来FUNCTION宏是由编译器以不同的方式解析的。。。