【发布时间】:2020-01-29 08:23:34
【问题描述】:
我很好奇这个事实,因为我想出了以下代码:
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”是外部的还是编译器错误是正确的行为?
【问题讨论】:
-
但是 MSVC 让您可以从另一个翻译单元访问它吗?名字修饰可能是它不可能的原因。
-
我知道它不能从另一个 TU 访问,但我认为链接器会将它作为输入并尝试处理它。所以链接会变慢。也许我错了。请纠正我,如果它以其他方式工作。
-
您使用的是哪个版本的 MSVC?哪个版本的 GCC?您将哪些标志和选项传递给编译器?编译器遵循哪个 C++ 标准?因为unnamed namespaces的链接规则随着C++11标准的变化而变化。
-
@Andrei - 我严重怀疑它对链接速度有明显影响,当然还不足以保证将其称为 QoI 错误。令人惊讶,也许。我愿意答应你。
-
@Someprogrammerdude。 C++14,O0 两者。 MSVC 2017,mingw gcc 8.3.0
标签: c++ gcc visual-c++