为何无法在函数内部定义已声明的extern变量?
问题原因解析
核心问题出在变量的声明、定义与作用域的区别上,拆解来看:
my.h里的extern int foo;是变量声明,它只告诉编译器“存在一个名为foo的全局int变量”,但并没有为这个变量分配内存——真正的变量定义需要在某个源文件里写出int foo;(或带初始化的int foo = xxx;)。错误版本的
use.cpp中,main()函数内的int foo = 7;是局部变量,它的作用域仅限main()函数内部,和extern声明的全局foo完全是两个无关的变量。当链接器处理my.cpp里的print_foo()时,它需要找到全局foo的定义,但整个程序里根本没有全局的foo,因此抛出undefined reference to 'foo'的错误。正确版本的
use.cpp中,开头的int foo;是全局变量的定义(全局变量默认会被初始化为0),此时my.h里的extern int foo;会直接指向这个全局变量。链接器能找到该变量的内存地址,print_foo()自然能正常输出你在main()中修改后的值。
错误版本代码
my.h
extern int foo; void print_foo();
my.cpp
#include <iostream> #include "my.h" void print_foo(){ std::cout << "foo = " << foo <<std::endl; }
use.cpp(错误)
#include "my.h" int main(){ int foo = 7; print_foo(); }
正确版本代码
use.cpp(正确)
#include "my.h" int foo; int main(){ foo = 7; print_foo(); }
内容的提问来源于stack exchange,提问作者eriksson543
相关产品推荐
相关产品推荐

