【问题标题】:What does external linkage mean [duplicate]外部链接是什么意思[重复]
【发布时间】:2023-08-11 07:03:01
【问题描述】:

考虑以下代码:

#include <stdio.h>

namespace EnclosingNmspc
{
    namespace Nmspc
    {
        extern int a;//This a and the a defined above denote the same entity
        int a=5;
    }
}

extern int a;

int main()
{ 
    printf("%d\n",a);
}

有3.5/2的报价:

当一个名字有外部链接时,它表示的实体可以是 由来自其他翻译单元范围的名称或来自 同一翻译单元的其他范围。

我不明白为什么这条规则在我的情况下不起作用?我有undefined reference 链接器错误。

【问题讨论】:

    标签: c++ extern linkage


    【解决方案1】:

    您的问题已经回答there canonically

    您在不同的编译单元中缺少::a 的定义。

    int a=5; 实际上在同一范围内定义了extern int a;。但这不是用

    访问的
    printf("%d\n",a);
    

    在您的主程序中。要检查命名空间中的内容,请尝试

    printf("%d\n",EnclosingNmspc::Nmspc::a);
    

    【讨论】:

    • 但规范说它所表示的实体可以通过其他翻译单元范围内的名称或from other scopes of the same translation unit来引用。
    • @St.Antario 您仍然需要提供定义,编译器不会自动为您完成。
    • 要么声明 extern int a; 并在别处定义,要么定义 int a; 并通过 extern 声明从别处访问它。如果您想从外部链接中隐藏a,请将其放在未命名的命名空间中。
    • 请注意没有阴影(参见 3.3.10/1)。声明 extern int a 和定义 int a=5 表示同一个实体(参见 3.3.1/4)。
    • 那使用extern 有什么意义呢??