gpt4 book ai didi

c++ - 在未命名命名空间内使用外部链接初始化变量

转载 作者:行者123 更新时间:2023-11-30 01:17:15 25 4
gpt4 key购买 nike

我想为“x”提供一个定义。我尝试使用“extern int x = 42”。但是,g++ 提示“x”同时具有外部和初始值设定项。我试图找到不允许这样做的 c++11 规范的相关部分,但我找不到任何此类条款。规范确实不允许这样做吗?如果是,请引用相关部分。

namespace {
int f() {
extern int x;
return x;
}
}

最佳答案

通过提供初始化器,您可以将声明转换为具有外部链接的定义

来自 §3.1/2 [basic.def]

A declaration is a definition unless it declares a function without specifying the function’s body (8.4), it contains the extern specifier (7.1.1) or a linkage-specification (7.5) and neither an initializer nor a function-body, ...

但是具有外部链接的变量不能在函数内定义,只能在命名空间范围内定义,这就是 gcc 拒绝您的代码的原因。因此,请在命名空间范围内提供定义。

namespace {
extern int x = 0;
int f() {
// no need for extern declaration here, name lookup will find x
return x;
}
}

这行得通,但是给在未命名的命名空间中定义的名称提供外部链接,如果不是无用的话,那肯定是奇怪的。


请注意,gcc 仍会对上述代码发出警告

warning: 'x' initialized and declared 'extern'

然而,从这个gcc bug report关于警告:

This is a coding style warning - the code is valid, but extremely unidiomatic for C since "extern" is generally expected to mean that the declaration is not providing a definition of the object.

关于c++ - 在未命名命名空间内使用外部链接初始化变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24771192/

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