为何C++中外联变量未触发重定义错误?实为赋值操作
extern变量声明、定义与赋值的误区解析
代码场景
driver.h中的变量声明
namespace org::lib { extern bool myVar; void myFunction(); }
driver.cpp中的变量定义
#include "driver.h" namespace org::lib { bool myVar = false; void myFunction(){ if (myVar){ //.... } } }
main.cpp中的调用代码
#include "driver.h" using org; int main(int arc, char** argv){ lib::myVar = true; //曾误以为这是重定义,会把driver.cpp中定义的false改为true lib::myFunction(); }
疑问与解析
最初疑惑:编译main.cpp时,myVar为什么没有出现重定义错误?明明已经在driver.cpp中定义过,难道main.cpp里是重复定义?
实际原因:
driver.h里的extern bool myVar;是变量声明,只用来告诉编译器该变量在其他编译单元中存在,不会为变量分配内存。driver.cpp里的bool myVar = false;是变量定义,这一步才会为变量分配内存并完成初始化,整个程序中这类定义只能出现一次。- main.cpp里的
lib::myVar = true;是赋值操作,只是修改已分配内存的变量的值,不属于定义行为,因此不会触发重定义错误。
内容的提问来源于stack exchange,提问作者user1008636
相关产品推荐
相关产品推荐

