C++中extern声明的全局变量为何定义在main函数内无法正常运行?
相关代码
use.cpp
#include "my.h" int main() { int foo = 7; print_foo(); print(99); }
my.h
#pragma once extern int foo; void print_foo(); void print(int i);
my.cpp
#include<iostream> #include "my.h" void print_foo() { std::cout << foo; } void print(int i) { std::cout << i; }
问题原因
核心原因是extern声明的全局变量和函数内定义的局部变量是完全独立的两个实体,二者作用域完全不重叠:
extern int foo;是全局作用域的变量声明,作用是告知编译器:当前编译单元不用管foo的定义,链接阶段会从其他编译单元找这个全局变量的定义。- 你在
main函数内部定义的int foo =7;是仅在main函数内生效的局部变量,和全局作用域的foo没有任何关联,不会被当做全局foo的定义。这种情况下全局foo始终没有对应的定义,链接阶段会直接报undefined reference to 'foo'错误,程序无法正常运行。 - 当你把
int foo =7;移到main函数之外的全局作用域时,这个定义就和头文件里的extern声明匹配,链接阶段可以找到对应的变量,程序就能正常运行。
内容的提问来源于stack exchange,提问作者jaronbass21
相关产品推荐
相关产品推荐

