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

时间:2018-03-23 10:14:41

标签: c c-preprocessor language-lawyer

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

例如:

#define Dummy 1
#define Dummy 2

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

3 个答案:

答案 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

无效。