这段代码很好编译:
extern int i = 10;
void test()
{
std::cout << "Hi" << i << std::endl;
}
虽然此代码给出了错误:
void test()
{
extern int i = 10;
std::cout << "Hi" << i << std::endl;
}
error: ‘i’ has both ‘extern’ and initializer
我在C++ Primer读到这个:
Any declaration that includes an explicit initializer is a definition.
We can provide an initializer on a variable defined as extern, but
doing so overrides the extern. An extern that has an initializer is a
definition. It is an error to provide an initializer on an extern inside a
function.
有人可以提供一个解释,说明为什么这是一个错误,如果在函数本地完成,而在全局范围允许相同?
解决方法:
在函数内定义外部变量的原因没有意义如下:
当您声明符号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. HOwever,如果我们删除主内部的extern,它将输出10.这是因为没有extern,我没有链接到全局i,但创建它自己的本地副本i.
如果我们允许任何函数“定义”i,那么在函数内定义extern 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.这与尝试“初始化”值非常不同.
简而言之,外部变量实际上只作为全局变量有意义,并且应该在全局范围内定义.在您的示例中,第一个版本不会为我编译.我发现这很有趣.可能值得查看标准文档,看看它是否被简洁地定义,或者您的编译器是否可能以旨在添加额外保护的方式处理此问题…