Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.fds-net.ru/ashowflat.php?Number=11360453&src=&showlite=
Дата изменения: Unknown
Дата индексирования: Tue Apr 12 05:04:09 2016
Кодировка: Windows-1251
[C++] Плохо не использовать namespace - Public forum of MSU united student networks
Root | Google | Yandex | Mail.ru | Kommersant | Afisha | LAN Support
  
Technical >> Development (Archive)

Страницы: 1
Pooh

Рег.: 23.10.2003
Сообщений: 5399
Рейтинг: 3869
  [C++] Плохо не использовать namespace
      15.02.2013 21:44
1

Сейчас в очередной раз поразился, как небольшие и простые изменения в программе могут привести к трудной ошибке. В реальном коде ошибка возникла с темплейтной функцией, вызванной для разных структур с одинаковыми именами. Но чтобы проиллюстрировать достаточно простого примера:

#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
2

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
2

Тогда это 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
4

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

__ka
Nobrainer

Рег.: 20.11.2004
Сообщений: 533
Рейтинг: 45
  Re: [C++] Не использовать namespace [re: Pooh]
      15.02.2013 23:15
3

Дополнительно стоит отметить, что если вынести 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
2

сейчас как-то странно сформулирован заголовок треда, кажется будто 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
1

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




#warning "You should include <sys/socket.h>. This time I will do it for you."
Страницы: 1

Technical >> Development (Archive)

Дополнительная информация
0 зарегистрированных и 0 анонимных пользователей просматривают этот форум.

Модераторы:  DarkGray 

Печать темы

Права
      Вы можете создавать новые темы
      Вы можете отвечать на сообщения
      HTML отключен
      UBBCode включен

Рейтинг:
Просмотров темы:

Переход в