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

C中的宏。。。。请给出解决方案,c,macros,c-preprocessor,C,Macros,C Preprocessor,假设我声明了一个宏名xyz 现在,我正在创建另一个宏xyz1并引用第二个宏中的第一个宏,即xyz 最后,我将创建另一个宏xyz2并引用第三个宏中的第二个宏 现在我的问题是:这是正确的吗?它的执行没有任何问题? 宏xyz定义了两次。为什么它没有给出一个错误?解决方案是什么?不,第一个宏只能定义一次。当你写作时 #define Symbol SymbolResolution 无论在哪里看到符号,预处理器都将用符号替换符号解析。如果SymbolResolution是一个define,或者包含一些定义

假设我声明了一个宏名xyz

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

最后,我将创建另一个宏xyz2并引用第三个宏中的第二个宏

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

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

#define Symbol SymbolResolution
无论在哪里看到符号,预处理器都将用符号替换符号解析。如果SymbolResolution是一个define,或者包含一些定义在同一个定义中的符号,那么它们都将被替换。这将发生,直到在整个翻译单元中没有为它们定义的符号为止


因此,您可以根据需要引用其他宏中的宏。但是,不能递归引用宏。您还应该注意这一点-如果您误用宏,这很容易导致大量难以阅读且很难调试的代码。

如果您指的是引用其他宏的宏,则这是合法的

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

但是,宏调用本身是不合法的

自引用宏是指 名称出现在其定义中。回忆起 所有宏定义都是 重新扫描以替换更多宏。 如果考虑到自我参照 使用宏,它会产生 无限大的扩张。到 防止这种情况,自我参照是必要的 不被视为宏调用


这听起来像是某种可怕的黑客行为。。。代表以后需要维护您的代码的人,请不要这样做…请显示一些代码。根据描述,听起来您只声明了一次xyz。为什么xyz定义了两次?根据您的描述,您正在创建once xyz、once xyz1和once xyz2等。此外,您无法定义并使其工作定义make_macrox define macro_xfuncname x嵌入的定义将不会被计算。
#define hello() (12)
#define test() (1+hello())