如何更改宏函数参数扩展排序?

时间:2014-10-23 09:01:49

标签: c++ macros c-preprocessor

我有以下代码:

#include <iostream>
#include <stdexcept>

#define TRACE_MACRO(EnterText) \
class CTrace \
{ \
public: \
CTrace() \
{ \
std::cout << EnterText;  \
} \
private:\
};

#define DO_TRACE TRACE_MACRO("[ENTER] " __FUNCTION__ "\r\n") 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;&lt ; “主”;

2 个答案:

答案 0 :(得分:3)

未经测试,但这是一个可能有效的简单重新安排:

#define TRACE_MACRO \
class CTrace \
{ \
public: \
CTrace(const char* text) \
{ \
std::cout << text;  \
} \
private:\
};

#define DO_TRACE TRACE_MACRO CTrace trace("[ENTER] " __FUNCTION__ "\r\n")

答案 1 :(得分:1)

吉米问道

  

是否有必要在宏def?

中定义一个全新的类

你回答说:

  

@Jimmy不,我只是想调用std :: cout来使用const   静态编译时字符串而不是指向编译时的指针   字符串,如果这是有道理的。

那么为什么不放弃课程呢?

#define DO_TRACE std::cout << "[ENTER] " << __FUNCTION__ << "\r\n"

这将输出:

[ENTER] main 
[ENTER] test

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

我可能错过了一些东西,告诉我,我会删除这篇文章......

顺便说一下,我使用http://www.compileonline.com/compile_cpp_online.php中的GNU GCC版本4.8.1编译了你帖子中的代码。它输出

[ENTER] CTrace 
[ENTER] CTrace

因此看起来FUNCTION宏被编译器差异地解决了......