我有以下代码:
#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 ; “主”;
答案 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宏被编译器差异地解决了......