gpt4 book ai didi

c++ - 为什么我不能在未命名的命名空间中声明变量后在全局范围内定义它?

转载 作者:行者123 更新时间:2023-11-30 02:28:56 25 4
gpt4 key购买 nike

据我了解:

我希望下面的代码声明一个变量,然后定义相同的变量:

// Declare ::<unnamed>::my_obj with internal linkage and add my_obj to the
// enclosing namespace scope (the global namespace scope).
namespace { extern int my_obj; }

// Expected: Define the variable declared above.
// Actual: Declare and define a new object, ::my_obj.
int my_obj(42);

相反,它声明了两个不同的对象,并警告我未使用的 extern int my_obj

为什么第二个my_obj 没有定义第一个my_obj?不在范围内吗?

最佳答案

语句“在未命名空间中声明的名称被添加到封闭的命名空间范围”并不意味着未命名空间的成员成为封闭空间的完整成员。此添加由一个隐式 using-directive 执行。这种添加使这些名称对名称查找可见,但不会使它们成为封闭命名空间的文字成员以用于其他目的。

您的代码中遇到的问题与以下代码段中的问题相同

namespace A
{
void foo();
}

using namespace A;

void foo() // <- Defines `::foo`, not `A::foo`
{
}

// `A::foo` remains undefined

尽管我们明确地将 A 中的名称“添加”到全局命名空间,但这并不意味着我们可以定义 A::foo 作为全局命名空间的成员,使用非限定名称 foo

为了在上面的例子中定义A::foo,你仍然需要使用它的限定名A::foo来引用它。对于未命名的命名空间,这是不可能的,原因很明显。

附言编译器通常将未命名的命名空间实现为具有内部编译器生成的名称的命名空间。如果您以某种方式找到了发现该名称的“技巧”,从技术上讲,您可能能够通过在定义中使用限定名称来单独定义您的 my_obj。但请记住,隐藏的命名空间名称在不同的翻译单元中是不同的,因此在每个翻译单元中都会产生一个唯一的 my_obj 变量。

关于c++ - 为什么我不能在未命名的命名空间中声明变量后在全局范围内定义它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40225370/

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