gpt4 book ai didi

c++ - 为什么在函数内的 extern 上提供显式初始化程序不会覆盖 extern?

转载 作者:行者123 更新时间:2023-12-01 13:06:45 26 4
gpt4 key购买 nike

根据 C++ Primer ,我们可以为定义为 extern 的变量提供初始化程序,但这样做会覆盖 extern。具有初始值设定项的 extern 是一个定义:

extern double pi = 3.1416; // definition

书中还指出,在函数内部为 extern 提供初始值设定项是错误的。在我看来,这两个陈述加在一起有点令人困惑,它们在我脑海中引起了以下问题:

如果在任何函数外部的 extern 上提供初始化程序可以覆盖 extern,为什么不能在函数内部的 extern 上提供它?

我也不明白为什么有人想要获得添加 extern 关键字的声明并提供初始值设定项。这与定义变量并为其提供初始化程序不一样吗?如果不是,为什么?答案是我们不能在函数内部为 extern 提供初始值设定项的原因吗?

最佳答案

According to C++ Primer, we can provide an initializer on a variable defined as extern, but doing so overrides the extern.



只是部分。

提供初始值设定项会强制声明为定义(除非是类的某些静态成员)。因此,它部分抵消了 extern 的影响。 ,这通常会抑制定义。然而, extern可以有其他效果,并且初始值设定项不会使这些效果无效。

It is also stated in the book that providing an initializer on an extern inside a function is an error.



是的。在块范围内, extern用于强制声明具有外部或内部链接(而不是声明局部变量)。但是,该语言禁止在本地范围内定义这样的变量。您只能在那里声明它,并在命名空间范围内提供匹配的定义。如果您提供初始化程序,那么您试图在那里定义变量,这是不允许的。

If providing an initializer on an extern outside any function can override the extern, why can providing it on an extern inside a function not?



正如我所解释的,这个前提是错误的。在这两种情况下,初始化程序都将声明转化为定义。在这两种情况下,它都不会覆盖 extern 的事实。影响被声明的实体的链接。

I also don't understand why someone would want to both obtain a declaration adding the extern keyword and provide an initializer. Is it not the same as defining a variable and providing an initializer on it? If it is not, why?



当我们使用 extern连同初始化器,通常是因为我们试图定义一个 const具有外部链接的对象。见下文:
// At global scope:
const int c1 = 42; // definition with internal linkage
extern const int c2; // declaration with external linkage
extern const int c3 = 42; // definition with external linkage

关于c++ - 为什么在函数内的 extern 上提供显式初始化程序不会覆盖 extern?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61664287/

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