当我在一个源文件中有多个具有相同名称的#define
时会发生什么:
例如:
#define Dummy 1
#define Dummy 2
我不打算使用它,但在生产代码中看到类似的东西。这是否符合标准?
答案 0 :(得分:9)
它违反了约束条件,因此需要符合条件的编译器才能发出诊断信息。
C11, 6.10.3 Macro replacement州:
当前定义为类似对象的宏的标识符不应由另一个#define预处理指令重新定义,除非第二个定义是类似于对象的宏定义且两个替换列表相同。 [..]
如上所述,如果替换是相同的,则不违反约束。所以
#define X 1
#define X 2
需要诊断;而
#define X 1
#define X 1
没关系。类似的约束适用于类似函数的宏(C11,6.10.3,2)。
答案 1 :(得分:4)
此:
#define Dummy 1
#define Dummy 2
与:
相同#define Dummy 2
但是你可能会得到(我不确定标准是什么意思)第二个'Dummy': macro redefinition
#define
警告
换句话说:最后#define
获胜。
如果您想要正确地做事,您应该使用#undef
:
#define Dummy 1
#undef Dummy
#define Dummy 2 // no warning this time
BTW:有些情况下,改变宏的定义是完全可以的。
答案 2 :(得分:1)
C标准#6.10.3.5p8的一个例子
示例6为了演示重新定义规则,以下序列有效。
#define OBJ_LIKE (1-1) #define OBJ_LIKE /* white space */ (1-1) /* other */ #define FUNC_LIKE(a) ( a ) #define FUNC_LIKE( a )( /* note the white space */ \ a /* other stuff on this line */ )
但以下重新定义无效:
#define OBJ_LIKE (0) // different token sequence #define OBJ_LIKE (1 - 1) // different white space #define FUNC_LIKE(b) ( a ) // different parameter usage #define FUNC_LIKE(b) ( b ) // different parameter spelling
[强调我的]
因此,这个
#define Dummy 1
#define Dummy 2
无效。