宏在代码

问题描述:

定义两次如果我定义两次宏如下宏在代码

#define a 2 
#define a 3 

了我认为的“a”的代码是由图2,#定义遇到3代替时发生任何不更多的a可用代码替换为3。但是当我执行它时,'a'被替换为3,任何人都可以解释这里发生了什么。

+0

这不是一个警告吗?你能解释为什么你不想精确地定义这种情况。 –

+0

是它的警告。我很想知道这将如何工作。 – Ann562

我不清楚你期待看到什么。

第二行覆盖第一行的a的定义。

之后遇到的任何a将被替换为3

+0

我的疑问是“#define a 2”将在“#define a 3”行以及其他部分代码中将“a”替换为2。因此,第二个宏定义将变为“#define 2 3” 。现在“2”被替换为3.它是如何工作的 – Ann562

+0

不,在定义 –

a将不会被替换为#define a 3中的2,因为这也是预处理器。

处理#define a 2后,a值是2,但它是由下面的语句覆盖#define a 3

+0

中定义了'#define-d宏的名称*从未*扩展是的,你是对的,但恕我直言,你需要扩展你的回答更适合这个特定的问题。 –

如果你定义一个宏两次这样,编译器至少应该给你警告,如果不是错误。这是一个错误。

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

您可以通过显式删除以前的定义重新定义一个宏:

#define a 2 
/* In this part of the code, a will be replaced with 2 */ 
... 

#undef a 
#define a 3 
/* From here on, a will be replaced with 3 */ 
... 

宏替换发生,因为该文件被读取,使用活动的宏定义在文件中的这个位置,除了内(大部分)预处理指令。

§ 6.10/7:除非另有说明,否则预处理指令中的预处理标记不受宏展开影响。

§ 6.10.3.5/1:直到遇到相应的#undef指令或直到预处理转换单元结束时(如果没有遇到任何指令),宏定义才会持续(与块结构无关)。