[C++] Плохо не использовать namespace

tolval58

Сейчас в очередной раз поразился, как небольшие и простые изменения в программе могут привести к трудной ошибке. В реальном коде ошибка возникла с темплейтной функцией, вызванной для разных структур с одинаковыми именами. Но чтобы проиллюстрировать достаточно простого примера:
#include <iostream>
struct S
{
    int a;
    S{a = 4;}
};
void main
{
    S s;
    std::cout<<s.a<<std::endl;
}
Выводит 4.
Если есть другой файл, в котором:
struct S
{
    int a;
    S{a = 5;}
};
void not_use
{
    S s;
}
то все компилируется без каких-либо ворнингов, но может вывестись 5 или 4.
ЗЫ. 2005 студия. Если менять названия файлов, то выводится то 4, то 5.

smit1

Но чтобы проиллюстрировать достаточно простого примера
Да ладно?
Если второе объявление каким-то образом видно в файле с main то компилятор должен ругнуться.

tolval58

Не, это же другой файл, другая единица компиляции.

smit1

Тогда это undefined behavior
Как-то повезло не попасть на такое

ppplva

По умному это называется "ODR violation".

amkharchenko

Дополнительно стоит отметить, что если вынести S::S из описания класса наружу, то неявное приписывание inline пропадет и мы получим-таким ошибку multiple definitions.

Serab

сейчас как-то странно сформулирован заголовок треда, кажется будто namespace — это плохо.

ava3443

Дополнительно стоит отметить, что если вынести S::S из описания класса наружу, то неявное приписывание inline пропадет и мы получим-таким ошибку multiple definitions.
а на юниксах ещё можно наступить на граблю если эта структура по-разному определена в разных shared libraries, подгружаемых в один процесс, а visibility не используется (или вообще отсутствует на платформе)

amkharchenko

Для меня вообще, кстати, большая загадка, как люди жили в том же линуксе до введения -fvisibility в gcc. У многих, как мне кажется, страх перед shared objects и желание все статически слинковать идет с тех пор.
Оставить комментарий
Имя или ник:
Комментарий: