【C语言-进阶】C 或者 C++中,如果重复define了两次,以哪次为基准?
在 C/C++ 中,如果同一个宏被 #define 了两次且定义的内容完全相同,大多数编译器不会报错(符合标准行为)。但如果两次定义的内容不同,则会导致编译错误(重定义错误)。
具体规则如下:
1. 两次定义完全相同
#define VALUE 100
#define VALUE 100 // 相同内容,通常不报错(允许)
-
符合 C/C++ 标准(C99/C++11 起),允许重复定义相同的宏。
-
编译器一般不会警告,即使开启
-Wall。
2. 两次定义内容不同
#define VALUE 100
#define VALUE 200 // 错误:宏重定义不一致
-
会触发编译错误(如
#error "macro redefined"或类似的错误信息)。 -
在 GCC/Clang 中可使用
-Wmacro-redefined警告。
3. 如何避免意外重定义
方法 1:使用 #ifndef 保护
方法 2:使用 #undef 显式取消定义(谨慎使用)
#undef VALUE
#define VALUE 200
4. 编译器差异示例
// test.c
#define X 10
#define X 10 // 相同,OK
#define X 20 // 不同,编译错误
-
GCC/Clang 错误信息:
error: 'X' redefined [-Werror]
5. 预定义宏的例外情况
某些编译器预定义的宏(如 __DATE__, __FILE__)不允许重定义,即使相同内容也会报错。
总结
-
相同定义:以第一次为准(实际上两次相同,无影响)。
-
不同定义:编译错误,没有“以哪次为基准”的问题,因为会直接报错终止编译。
-
最佳实践:始终用
#ifndef或#pragma once(头文件)来避免重定义问题。

浙公网安备 33010602011771号