C语言中的多宏

C语言中的多宏,c,C,为什么答案是20而不是10? 既然/*#define a 10*/是第一个宏,那么它不应该被取代以代替“a”吗?你问题的前提(应该使用第一个定义)是错误的 您的编译器已决定使用第二个定义。它真的可以随心所欲,因为您的程序格式不正确/已损坏/错误: [C99:6.10.3/2]:当前定义为类对象宏的标识符不得由另一个#define预处理指令重新定义,除非第二个定义是类对象宏定义且两个替换列表相同。[……] 在这里,我们可以清楚地看到GCC的非标准行为: 如果使用与旧定义不完全相同的定义重新定义宏,

为什么答案是20而不是10?
既然/*#define a 10*/是第一个宏,那么它不应该被取代以代替“a”吗?

你问题的前提(应该使用第一个定义)是错误的

您的编译器已决定使用第二个定义。它真的可以随心所欲,因为您的程序格式不正确/已损坏/错误:

[C99:6.10.3/2]:
当前定义为类对象宏的标识符不得由另一个
#define
预处理指令重新定义,除非第二个定义是类对象宏定义且两个替换列表相同。[……]

在这里,我们可以清楚地看到GCC的非标准行为:

如果使用与旧定义不完全相同的定义重新定义宏,预处理器将发出警告并更改宏以使用新定义。如果新定义完全相同,则重新定义将被忽略。例如,这允许两个不同的头定义一个公共宏。只有当定义不匹配时,预处理器才会抱怨


简而言之:不要这样做。

既然
#define a 20
是第二个宏,那么它不应该被替换来代替
a
gcc
编译器在第二个定义与第一个定义不同时发出
警告:“a”重定义的
如果你的问题是关于C的,为什么你决定使用这个标记?但是当a搜索一个取代基时,它发现#define a 10是最先声明的。所以a不应该被10取代吗?
a
不搜索任何东西。我承认代码格式不正确,我只是想知道在这种情况下代码的流动情况。无论如何,谢谢你!:)@阿比基蒂耶:你应该帮自己一个忙,养成学习/阅读/使用文档的习惯,而不仅仅是相信传闻:)
#define a 10
#define a 20
{

    printf("%d",a);
}