2014-03-24 30 views
0

我有一个宏观DDLogDebug(...),我想做到以下几点如何在另一个宏中存储宏?

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

但它不工作。取而代之的#define _DDLogDebug(arg...) DDLogDebug(args),我需要一个命令,“专卖店”的宏观DDLogDebug_DDLogDebug的内容。

  • 有没有这样的事情存在?

  • 一个应该如何当一个人想修改宏其定义不暴露呢?

回答

1

你不能用纯粹的标准预处理器做这样的事情。

的原因是,宏定义并不像例如工作在主要语言功能的定义:在那个时候你定义_DDLogDebug,它实际上没有链接到的DDLogDebug的定义 - 它的存储正是你写。除非在任何定义之外的程序中使用宏,否则它不会尝试实际找到任何名称的扩展。到那时,DDLogDebug的定义已经消失。

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

如果不能解决这个问题,你可能有一些运气的非标可广泛支持push_macro and pop_macro directives


使用push和pop的例子:通过gcc -E

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

运行这一点,你会看到它发出FOO(新行)123。与Clang合作。

+0

你知道,如果这些指令编程的OSX的时候有哪些?看来他们不是。 – Colas

+1

@Colas他们在OSX上为我工作得很好......看到修改后的答案。 – Leushenko

相关问题