1

我很好奇这个事实,因为我想出了以下代码:

namespace
{
    int my_variable = 12;
    void get_data_a_lot() {}
}


int main()
{
    my_variable++;

    get_data_a_lot();
}

并用 msvc 编译我得到以下信息:

00E 00000000 SECT4  notype       External     | ?my_variable@?A0x087c0a53@@3HA (int `anonymous namespace'::my_variable)
025 00000000 SECT6  notype ()    Static       | ?get_data_a_lot@?A0x087c0a53@@YAXXZ (void __cdecl `anonymous namespace'::get_data_a_lot(void))

但是当我用 gcc 编译时,我得到以下信息:

002 00000000 SECT2  notype       Static       | _ZN12_GLOBAL__N_111my_variableE
003 00000000 SECT1  notype ()    Static       | _ZN12_GLOBAL__N_114get_data_a_lotEv

所以问题是:“my_variable”是外部的还是编译器错误是正确的行为?

4

1 回答 1

2

标准说

[基本.链接]

4未命名命名空间或在未命名命名空间内直接或间接声明的命名空间具有内部链接。所有其他命名空间都有外部链接。具有命名空间范围但没有在上面给出内部链接的名称,如果它是

  • 一个变量; 或者
  • [...]

据此my_variable 应有内部联动。然而,必须牢记,如何实施链接完全取决于实施。MSVC 没有标记符号的Static事实并不意味着它违反了标准。所有标准要求的是一个实体,其名称具有内部链接,与其他 TU 中具有相同名称的实体不同,因此它只能在定义它的单个 TU 中由该名称引用。名称修改很可能是MSVC 如何轻松完成它。

于 2020-01-29T08:31:12.303 回答