【问题标题】:Embedding preprocessor directive into function name将预处理器指令嵌入到函数名中
【发布时间】:2015-02-04 13:09:19
【问题描述】:

我想将预处理器指令嵌入到函数名中。基本上我想制作一个宏,它将预处理器定义作为参数并将它定义的 VALUE 连接起来以获取函数名称。

基本上是这样的:

#define PREFIX foo
#define CALL(P, x) _##P_bar(x)

...then 
CALL(PREFIX, x) should become _foo_bar(x)

不幸的是,这导致_P_bar 而不是_foo_bar

有没有可能让它像上面那样工作?

【问题讨论】:

  • 请注意,全局范围内以下划线开头的名称是为编译器和库保留的。你不应该使用这些。

标签: c macros c-preprocessor preprocessor-directive


【解决方案1】:

C 标准为紧接在## 运算符前后的宏参数定义了特殊行为。在这种情况下,它们没有完全展开。这就是为什么您的代码没有按预期运行的原因。要进一步扩展参数,您必须以不紧跟在## 运算符之前或之后的方式使用它。请尝试以下操作:

#define PREFIX foo
#define CALL2(P,x) _##P##_bar(x)
#define CALL(P, x) CALL2(P,x)

CALL(PREFIX, x) 

【讨论】:

  • 你确定#define CALL(P,x) _##P##_bar(x) 不起作用吗?我想问题只是识别 P 宏参数,因为下划线隐藏它,目标是做两个连接,而不仅仅是一个。
  • @Micheled'Amico 是的。我已经检查过了。 CALL(P,x) _##P##_bar(x) 不起作用。
  • 非常感谢。这太棒了! :)
猜你喜欢
  • 1970-01-01
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多