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

Macros 如何在另一个宏中存储宏?,macros,c-preprocessor,Macros,C Preprocessor,我有一个宏DDLogDebug(…),我想执行以下操作 #define _DDLogDebug(arg...) DDLogDebug(args) #undef DDLogDebug #define DDLogDebug(args...) doSomething(); _DDLogDebug(arg...) 但它不起作用。我需要一个命令来“存储”宏DDLogDebug的内容,而不是#define#u DDLogDebug(arg…)DDLogDebug(args) 这样的事情存在吗 如果要修改

我有一个宏
DDLogDebug(…)
,我想执行以下操作

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

  • 这样的事情存在吗

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


纯标准预处理器无法执行类似操作

原因是宏定义的工作方式与主语言中的函数定义不同:当您定义
\u DDLogDebug
时,它实际上并没有链接到
DDLogDebug
的定义,而是准确地存储了您编写的内容。它不会尝试实际查找任何名称的扩展,直到宏在程序中的任何定义之外使用。至此,
DDLogDebug
的定义已经不存在了

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

如果你不能解决这个问题,你可能会有一些非标准的,但广泛支持的运气


使用推送和弹出的示例:

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

通过
gcc-E
运行此命令,您将看到它发出
FOO
(新行)
123
。与Clang一起工作。

您知道在为OSX编程时这些指令是否可用吗?看来他们不是。