在函数内部定义外部变量没有意义的原因如下:
当您声明一个符号 extern 时,您是在告诉编译器将此值的所有此类出现链接到同一个符号。extern int i 的任何出现;在您的程序中将链接到外部定义的 i。看这个例子:
#include <iostream>
using namespace std;
extern int i;
int i = 10;
void test()
{
std::cout << "Hi" << i << std::endl;
}
int main()
{
extern int i;
i++;
test();
}
此示例应输出 hi11。但是,如果我们删除 main 内部的 extern,它将输出 10。这是因为没有 extern,i 不会链接到全局 i,而是创建它自己的 i 的本地副本。
在函数内部定义 extern i 的原因是没有意义的,如果我们允许任何函数“定义” i 会怎样。哪个函数先运行?什么时候定义?
假设以下示例有效,输出将是什么???
#include <iostream>
using namespace std;
extern int i;
int i = 10;
void test()
{
std::cout << "Hi" << i << std::endl;
}
void test2() {
extern int i = 1000;
std::cout<< "HI" << i << std::endl;
}
void test3() {
extern int i;
i = 1000;
std::cout<< "HI" << i << std::endl;
}
int main()
{
extern int i;
i++;
test();
i = 0;
test2();
}
test2 的输出应该是 0 还是 1000?再看看我的 test3,这里我们简明扼要地说,将我的 i 链接到外部定义的 i,并将其值指定为 1000。这与尝试“初始化”一个值非常不同。
简而言之,外部变量实际上只对全局变量有意义,并且应该在全局范围内定义。在您的示例中,第一个版本也无法为我编译。我觉得这很有趣。可能值得查看标准文档以查看是否定义简洁,或者您的编译器是否可能以旨在添加额外保护的方式处理此问题......