gpt4 book ai didi

c++ - 为什么在函数内初始化外部变量会出错?

转载 作者:IT老高 更新时间:2023-10-28 12:57:31 24 4
gpt4 key购买 nike

这段代码编译得很好:

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。但是,如果我们删除 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。这与尝试“初始化”一个值非常不同。

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

关于c++ - 为什么在函数内初始化外部变量会出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17090354/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com