【发布时间】:2014-10-23 09:01:48
【问题描述】:
我有以下代码:
#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
【问题讨论】:
-
是否需要在宏def中定义一个全新的类?
-
根据C99
__FUNCTION__不是宏,预处理器不理解“当前函数”的概念,因为它对C++语法或作用域一无所知,所以无法知道函数的名字。 -
@Jimmy 不,我只是希望对 std::cout 的调用使用 const 静态编译时间字符串,而不是指向编译时间字符串的指针,如果这有意义的话。
标签: c++ macros c-preprocessor