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
它违反了约束条件,因此需要符合标准的编译器来发出诊断信息.
当前定义为类似对象的宏的标识符不应由另一个#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).
这个:
#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)
顺便说一句:在某些情况下,更改宏的定义是完全可以的。
| 归档时间: |
|
| 查看次数: |
632 次 |
| 最近记录: |