Что говорит стандарт об анонимном пространстве имен и внутренней связи? - PullRequest
1 голос
/ 29 января 2020

Мне любопытно узнать об этом факте, поскольку я придумал следующий код:

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


int main()
{
    my_variable++;

    get_data_a_lot();
}

и скомпилировал с msv c Я получаю следующее:

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))

Но когда я компилирую с g cc, я получаю следующее:

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

Итак, вопрос в том, правильно ли поведение my_variable является External или ошибка компилятора?

1 Ответ

2 голосов
/ 29 января 2020

Стандарт гласит:

[basi c .link]

4 безымянное пространство имен или пространство имен, объявленное непосредственно или косвенно в безымянном пространстве имен имеет внутреннюю связь. Все остальные пространства имен имеют внешнюю связь. Имя, имеющее область пространства имен, которому не была предоставлена ​​внутренняя связь выше, имеет ту же связь, что и окружающее пространство имен, если это имя

  • переменной; или
  • [...]

Согласно которому my_variable должен иметь внутреннюю связь. Однако следует помнить, что способ реализации полностью зависит от реализации. Тот факт, что MSV C не помечает символ Static, не означает, что он нарушает стандарт. Все, что требует стандарт, - это объект, имя которого имеет внутреннюю связь, отличную от объектов с тем же именем в других TU, так что на него можно ссылаться только по этому имени в одном TU, в котором он определен. как MSV C легко справляется с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...