预处理器宏:如何插入参数?

时间:2011-01-01 23:23:48

标签: c++ macros c-preprocessor

该代码包含以下几个部分:

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

(至少这将清楚地概述目前正在进行缓刑的事情,而不会在代码中看到它们)

1 个答案:

答案 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的定义中即可。