C++中extern const结构体声明差异:为何flavor2.h引发重定义?
C++中extern声明与重定义错误解析
代码示例
flavor1.h
extern const struct X { int i = 1; } x;
flavor2.h
struct Y { int i = 1; } extern const y;
impl.cpp
#include "flavor1.h" #include "flavor2.h" const X x; const Y y;
编译错误
编译时触发错误:'const Y y' : redéfinition(重定义),尽管看起来y被声明为extern。
问题核心
flavor2.h中实际声明/定义的是什么?为何它和flavor1.h的写法不等价?
详细分析
flavor1.h的行为
这个写法是标准的外部变量声明:- 首先定义了
struct X类型, - 然后用
extern const修饰变量x,明确告诉编译器:x是一个const struct X类型的变量,它的定义在其他文件中,当前只是声明,不会生成变量实体。
- 首先定义了
flavor2.h的行为
这个写法的语法顺序出错了,实际效果是:- 先定义了
struct Y类型, - 紧接着直接定义了一个
const Y类型的变量y。这里的extern const写在变量名之后,不符合C++的语法规则,无法起到外部声明的作用。
等价于:
struct Y { int i = 1; }; const Y y; // 这是变量定义,而非声明- 先定义了
当impl.cpp包含flavor2.h时,已经引入了y的定义,之后再在impl.cpp中写const Y y;就会触发重定义错误。
修正方案
要让flavor2.h的行为和flavor1.h一致,需要调整语法顺序,写成标准的外部声明:
extern const struct Y { int i = 1; } y;
或者拆分类型定义和变量声明:
struct Y { int i = 1; }; extern const Y y;
内容的提问来源于stack exchange,提问作者PinkTurtle
相关产品推荐
相关产品推荐

