同一项目中两个.cpp文件同名变量仅一个为static时为何无链接错误?
全局变量static与链接属性的解析
核心原因在于C++中全局变量的链接属性:
main.cpp里的
static int foo = 10是内部链接变量。static修饰全局变量时,会把这个变量的可见范围严格限制在当前编译单元(也就是main.cpp文件)内,链接器不会将这个符号暴露给其他编译单元。换句话说,another.cpp完全“不知道”这个foo的存在。another.cpp里的
int foo = 20是外部链接变量,默认全局变量都是外部链接,它的符号会被链接器纳入全局符号表,但因为main.cpp的foo是内部链接,两者的符号在链接阶段完全不冲突——它们是两个独立的变量,只是名字相同而已。
当两个foo都不加static时,它们都属于外部链接符号。根据C++的单一定义规则(ODR),整个程序中同一个外部链接符号只能有一个定义,所以链接器会检测到重复定义并报错。
你之前的理解有误:main.cpp里看不到another.cpp的foo(除非你用extern int foo声明),another.cpp也看不到main.cpp里的static foo。static的作用就是隔离全局变量的可见范围,所以这两个foo完全互不相干,链接器当然不会要求它们都加static。
内容的提问来源于stack exchange,提问作者Szymon Nowaczyk - Słomian
相关产品推荐
相关产品推荐

