该代码包含以下几个部分:
int filter;
#ifdef INPUTFILTER_FOO
LOG4CXX_DEBUG(log, "FOO filter used");
filter = F_FOO;
#endif
它们在代码中被多次使用(用于为所有测试配置提供I / O,线程支持等),大致它们对于调试是必不可少的,但是使代码看起来很苛刻,想要用宏替换它们,一个用于每个category_type名称空间。
所以,想要扩展以下内容:
MACROSTUFFBAZ(log2, stuff, "BAZ")
< - 文本部分对于每个类都是唯一的,因此它也需要包含在宏中。
为:
#ifdef INPUTSTUFF_BAZ
LOG4CXX_DEBUG(log2, "BAZ stuff used");
stuff = S_BAZ;
#endif
要定义宏,请计划使用它:
debug.hpp:
#ifdef INPUTSTUFF_BAZ
#define MACROSTUFFBAZ ...
#else
#define MACROSTUFFBAZ
.. no code!
#endif
#endif
(至少这将清楚地概述目前正在进行缓刑的事情,而不会在代码中看到它们)
答案 0 :(得分:3)
这是我的尝试,虽然我不是100%确定它是否有效,因为我现在无法测试它,并且不同的编译器处理预处理器宏有点不同。但我认为这样的事情至少在视觉工作室中起作用。
基本上,您必须使用辅助宏将参数转换为字符串。其次,您可以使用##
来连接标识符:
#define PRMTOSTR_HLPR(x) #x
#define PRMTOSTR(x) PRMTOSTR_HLPR(x)
#ifdef INPUTSTUFF_BAZ
#define MACROSTUFFBAZ(A,B,C) \
LOG4CXX_DEBUG(A, PRMTOSTR(C)" stuff used"); \
B = S_##C;
#else
#define MACROSTUFFBAZ(A,B,C)
#endif
//used like this:
MACROSTUFFBAZ(log2, stuff, BAZ)
编辑:此处实际上不需要辅助宏,因此您只需将#C
直接放在MACROSTUFFBAZ的定义中即可。