当我定义具有相同名称的宏时会发生什么

Kam*_*aze 6 c language-lawyer c-preprocessor

当我#define在一个源文件中有多个具有相同名称的s 时会发生什么:

例如:

#define Dummy 1
#define Dummy 2
Run Code Online (Sandbox Code Playgroud)

我不打算使用它,但在生产代码中看到类似的东西.这是否符合标准?

P.P*_*.P. 10

它违反了约束条件,因此需要符合标准的编译器来发出诊断信息.

C11,6.10.3宏替换状态:

当前定义为类似对象的宏的标识符不应由另一个#define预处理指令重新定义,除非第二个定义是类似于对象的宏定义且两个替换列表相同.[..]

如上所述,如果替换是相同的,则不违反约束.所以

#define X 1
#define X 2
Run Code Online (Sandbox Code Playgroud)

需要诊断; 而

#define X 1
#define X 1
Run Code Online (Sandbox Code Playgroud)

没关系 类似的约束适用于类似函数的宏(C11,6.10.3,2).


Jab*_*cky 5

这个:

#define Dummy 1
#define Dummy 2
Run Code Online (Sandbox Code Playgroud)

是相同的:

#define Dummy 2
Run Code Online (Sandbox Code Playgroud)

但是你可能会得到(我不确定标准是什么意思)一个警告,比如'Dummy': macro redefinition第二个#define

换句话说:最后#define获胜。

如果你想正确地做事,你应该使用#undef

#define Dummy 1
#undef Dummy
#define Dummy 2    // no warning this time
Run Code Online (Sandbox Code Playgroud)

顺便说一句:在某些情况下,更改宏的定义是完全可以的。

  • 如果它违反了 C 标准,那么推理会发生什么就没有意义了。违反约束与未定义行为相同。因此,您在此问题中描述的“最后定义获胜”行为绝不是给出,也不应依赖。 (4认同)
  • 在没有 `undefine` 的情况下重新定义宏在技术上是无效的。 (3认同)
  • 如果两个 `#define` 的值相同,您就不会收到警告 (2认同)