假设我声明了一个宏名称xyz()
。
现在我正在创建另一个宏xyz1()
并引用第一个宏,即第二个宏xyz()
。
最后,我将创建另一个宏xyz2()
并在第3个引用第二个宏。
现在我的问题是:这是正确的(它正在执行没有任何问题)?
宏xyz()
定义了两次。为什么不给出错误?解决方案是什么?
答案 0 :(得分:2)
不,第一个宏只能定义一次。当你写
#define Symbol SymbolResolution
预处理器会将Symbol
替换为SymbolResolution
,只要它看到Symbol
。如果SymbolResolution
是#define
,或者包含一些符号#define
内的符号,那么它们将会被替换掉。这将发生在整个翻译单元中没有符号为#define
的符号之前。
因此,您可以根据需要从其他宏引用宏。但是,您不能递归地引用宏。您还应该小心这一点 - 如果您滥用宏,这很容易导致很多可读且很难调试的代码。
答案 1 :(得分:1)
如果您的意思是指引用其他宏的宏,那么它是合法的。
当预处理器扩展宏时 名称,宏的扩展替换 宏调用,然后是 检查扩展是否有更多宏 扩大。
#define hello() (12)
#define test() (1+hello())
然而,宏调用本身并不合法
自引用宏是其中的一个 名称出现在其定义中。召回 所有宏定义都是 重新扫描更多的宏来替换。 如果考虑自我引用 使用宏,它会产生 无限大的扩张。至 防止这种情况,自我引用是 不被视为宏观电话。