我有一个宏DDLogDebug(...)
,我想做以下
#define _DDLogDebug(arg...) DDLogDebug(args)
#undef DDLogDebug
#define DDLogDebug(args...) doSomething(); _DDLogDebug(arg...)
但它不起作用。而不是#define _DDLogDebug(arg...) DDLogDebug(args)
,我需要一个命令,将宏DDLogDebug
的内容“存储”到_DDLogDebug
。
这样的事情是否存在?
如果想要修改未公开定义的宏,应该怎么做?
答案 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合作。