C中的宏....请给出解决方案

时间:2010-04-07 09:32:11

标签: c macros c-preprocessor

假设我声明了一个宏名称xyz()

现在我正在创建另一个宏xyz1()并引用第一个宏,即第二个宏xyz()

最后,我将创建另一个宏xyz2()并在第3个引用第二个宏。

现在我的问题是:这是正确的(它正在执行没有任何问题)? 宏xyz()定义了两次。为什么不给出错误?解决方案是什么?

2 个答案:

答案 0 :(得分:2)

不,第一个宏只能定义一次。当你写

#define Symbol SymbolResolution

预处理器会将Symbol替换为SymbolResolution,只要它看到Symbol。如果SymbolResolution#define,或者包含一些符号#define内的符号,那么它们将会被替换掉。这将发生在整个翻译单元中没有符号为#define的符号之前。

因此,您可以根据需要从其他宏引用宏。但是,您不能递归地引用宏。您还应该小心这一点 - 如果您滥用宏,这很容易导致很多可读且很难调试的代码。

答案 1 :(得分:1)

如果您的意思是指引用其他宏的宏,那么它是合法的。

  

当预处理器扩展宏时   名称,宏的扩展替换   宏调用,然后是   检查扩展是否有更多宏   扩大。

#define hello() (12)
#define test() (1+hello())

然而,宏调用本身并不合法

  

自引用宏是其中的一个   名称出现在其定义中。召回   所有宏定义都是   重新扫描更多的宏来替换。   如果考虑自我引用   使用宏,它会产生   无限大的扩张。至   防止这种情况,自我引用是   不被视为宏观电话。