如何在另一个宏中存储宏?

时间:2014-03-24 17:38:08

标签: macros c-preprocessor

我有一个宏DDLogDebug(...),我想做以下

#define _DDLogDebug(arg...) DDLogDebug(args)
#undef DDLogDebug
#define DDLogDebug(args...) doSomething(); _DDLogDebug(arg...)

但它不起作用。而不是#define _DDLogDebug(arg...) DDLogDebug(args),我需要一个命令,将宏DDLogDebug的内容“存储”到_DDLogDebug

  • 这样的事情是否存在?

  • 如果想要修改未公开定义的宏,应该怎么做?

1 个答案:

答案 0 :(得分:1)

您无法使用纯标准预处理器执行此类操作。

原因是宏观定义并不像主语言中的函数定义:在您定义_DDLogDebug时,它实际上并未链接到DDLogDebug的定义 - 它正在存储您所写的内容。在任何定义之外的程序中使用宏之前,它不会尝试实际找到任何名称的扩展。到那时,DDLogDebug的定义已经消失。

这实际上是一种有价值的预期行为,因为它允许使用像X-macros这样的技术:一个定义可以提供一个框架,让不同的调用上下文决定如何以不同的方式实际使用它。外部宏不仅不依赖于编写时可用的定义,而且其内容的含义可以在整个程序中发生变化,而不必改变其结构。

如果您无法解决此问题,那么您可能会对非标准但广泛支持的push_macro and pop_macro directives感到满意。


使用推送和弹出的示例:

#define FOO 123
#pragma push_macro("FOO")
#undef FOO
FOO
#pragma pop_macro("FOO")
FOO

通过gcc -E运行此操作,您将看到它发出FOO(换行符)123。与Clang合作。