c – 为什么在函数内初始化extern变量会产生错误?

这段代码很好编译:

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.这与尝试“初始化”值非常不同.

简而言之,外部变量实际上只作为全局变量有意义,并且应该在全局范围内定义.在您的示例中,第一个版本不会为我编译.我发现这很有趣.可能值得查看标准文档,看看它是否被简洁地定义,或者您的编译器是否可能以旨在添加额外保护的方式处理此问题…

上一篇:C++中const关键字的用法与总结


下一篇:JavaScript 基础6