【问题标题】:Preprocessor macros: how to insert arguments?预处理器宏:如何插入参数?
【发布时间】:2011-01-01 23:23:47
【问题描述】:

代码有以下几个部分:

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

(至少这可以清楚地概述当前正在试用的东西,而不会在代码周围看到它们)

【问题讨论】:

  • 你不清楚filter = F_FOOstuff = S_BAZ:什么时候是S_?什么时候F_?是否依赖于宏参数?
  • @icecrime,它们只是另一个宏定义的值(文件名前缀、计数器、延迟等)。它们不依赖于参数,而是由宏定义。

标签: c++ macros c-preprocessor


【解决方案1】:

这是我的尝试,虽然我不能 100% 确定它是否有效,因为我现在无法对其进行测试,而且不同的编译器对预处理器宏的处理也略有不同。但我认为这样的事情至少在 Visual Studio 中有效。

基本上,您必须使用辅助宏将参数转换为字符串。其次,您可以使用## 连接标识符:

#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的定义中。

【讨论】:

  • #x 是正确的,但您不需要辅助宏。您可以简单地将#C 直接放在第二个宏中。字符串之间的空格也可以,它们将被连接起来。
  • 你是对的。我记得有些东西需要双重间接,但它是为了引用其他宏的值:stackoverflow.com/questions/216875/in-macros/217181#217181
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
相关资源
最近更新 更多