Pooh
|
|
|
|
|
Рег.: 23.10.2003
|
Сообщений: 5399
|
|
Рейтинг: 3869
|
|
[C++] Плохо не использовать namespace
15.02.2013 21:44
|
|
|
Сейчас в очередной раз поразился, как небольшие и простые изменения в программе могут привести к трудной ошибке. В реальном коде ошибка возникла с темплейтной функцией, вызванной для разных структур с одинаковыми именами. Но чтобы проиллюстрировать достаточно простого примера:
#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.
|
|
Rebble
|
ханжа
|
|
|
|
Рег.: 13.08.2004
|
Сообщений: 3115
|
Из: highway2hell
|
Рейтинг: 8250
|
|
Re: [C++] Не использовать namespace
[re: Pooh]
15.02.2013 21:51
|
|
|
Quote:
Но чтобы проиллюстрировать достаточно простого примера
Да ладно? Если второе объявление каким-то образом видно в файле с main(), то компилятор должен ругнуться.
|
And so much crap makes you blind |
|
Pooh
|
|
|
|
|
Рег.: 23.10.2003
|
Сообщений: 5399
|
|
Рейтинг: 3869
|
|
Re: [C++] Не использовать namespace
[re: Rebble]
15.02.2013 21:54
|
|
|
Не, это же другой файл, другая единица компиляции.
|
|
Rebble
|
ханжа
|
|
|
|
Рег.: 13.08.2004
|
Сообщений: 3115
|
Из: highway2hell
|
Рейтинг: 8250
|
|
Re: [C++] Не использовать namespace
[re: Pooh]
15.02.2013 21:58
|
|
|
Тогда это undefined behavior Как-то повезло не попасть на такое ))
|
And so much crap makes you blind |
|
Kai
|
|
|
|
|
Рег.: 25.10.2002
|
Сообщений: 8251
|
|
Рейтинг: 818
|
|
Re: [C++] Не использовать namespace
[re: Rebble]
15.02.2013 22:08
|
|
|
По умному это называется "ODR violation".
|
|
__ka
|
Nobrainer
|
|
|
|
Рег.: 20.11.2004
|
Сообщений: 533
|
|
Рейтинг: 45
|
|
Re: [C++] Не использовать namespace
[re: Pooh]
15.02.2013 23:15
|
|
|
Дополнительно стоит отметить, что если вынести S::S() из описания класса наружу, то неявное приписывание inline пропадет и мы получим-таким ошибку multiple definitions.
|
#warning "You should include <sys/socket.h>. This time I will do it for you." |
|
unkulunkulu
|
unkulunkulunkulu
|
|
|
|
Рег.: 12.11.2006
|
Сообщений: 18453
|
Из: 13000
|
Рейтинг: 11759
|
|
Re: [C++] Не использовать namespace
[re: Pooh]
16.02.2013 00:26
|
|
|
сейчас как-то странно сформулирован заголовок треда, кажется будто namespace - это плохо.
|
|
vond
|
|
|
|
|
Рег.: 08.04.2004
|
Сообщений: 6076
|
Из: Москва
|
Рейтинг: 1202
|
|
Re: [C++] Не использовать namespace
[re: __ka]
16.02.2013 01:09
|
|
|
В ответ на:
Дополнительно стоит отметить, что если вынести S::S() из описания класса наружу, то неявное приписывание inline пропадет и мы получим-таким ошибку multiple definitions.
а на юниксах еще можно наступить на граблю если эта структура по-разному определена в разных shared libraries, подгружаемых в один процесс, а visibility не используется (или вообще отсутствует на платформе)
|
|
__ka
|
Nobrainer
|
|
|
|
Рег.: 20.11.2004
|
Сообщений: 533
|
|
Рейтинг: 45
|
|
Re: [C++] Не использовать namespace
[re: vond]
16.02.2013 17:59
|
|
|
Для меня вообще, кстати, большая загадка, как люди жили в том же линуксе до введения -fvisibility в gcc. У многих, как мне кажется, страх перед shared objects и желание все статически слинковать идет с тех пор.
|
#warning "You should include <sys/socket.h>. This time I will do it for you." |
|