You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:20:25