[C++] Плохо не использовать namespace
Но чтобы проиллюстрировать достаточно простого примераДа ладно?
Если второе объявление каким-то образом видно в файле с main то компилятор должен ругнуться.
Не, это же другой файл, другая единица компиляции.
Как-то повезло не попасть на такое
По умному это называется "ODR violation".
Дополнительно стоит отметить, что если вынести S::S из описания класса наружу, то неявное приписывание inline пропадет и мы получим-таким ошибку multiple definitions.
сейчас как-то странно сформулирован заголовок треда, кажется будто namespace — это плохо.
Дополнительно стоит отметить, что если вынести S::S из описания класса наружу, то неявное приписывание inline пропадет и мы получим-таким ошибку multiple definitions.а на юниксах ещё можно наступить на граблю если эта структура по-разному определена в разных shared libraries, подгружаемых в один процесс, а visibility не используется (или вообще отсутствует на платформе)
Для меня вообще, кстати, большая загадка, как люди жили в том же линуксе до введения -fvisibility в gcc. У многих, как мне кажется, страх перед shared objects и желание все статически слинковать идет с тех пор.
Оставить комментарий
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.