| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > c++ static-init-fiasco |
| Автор: amnesiacorg 3.9.2012, 14:53 | ||||||||||||
| Добрый день. Изучаю С++ по книге Bruce Eckel "Thinking in C++". В десятой главе (Name Control) есть упражнение под номером 32:
Вот код: mirror.h:
one.cc:
two.cc
three.cc
и так далее, наконец five.cc:
Однако как бы я не менял порядок линковки, m5.test() все время возвращает true. (Порядок линковки файлов менял так: g++ five.o four.o three.o two.o one.o; Плюс пробовал указывать порядок инициализации с помощью __attribute__ ((init_priority (N)));) Однако никак не получилось заставить m5.test() вернуть false. Более того, я не совсем понимаю как этого можно добиться. Порядок инициализации глобальных переменных в разных единацах трансляции не определен (стандартом не определяется, в каком порядке она будет выполняться, т.е. будет one.cc раньше или позже two.cc). Однако точно говорится, что к моменту вызова main() инициализация всех глобальных обьектов будет закончена. Как в этом случае можно получить проблему static-init-fiasco, если мы не зависим от внутреннего состояния обьектов в момент их инициализации (нам необходимо только адрес этих переменных, а не их состояние)? |
| Автор: bsa 3.9.2012, 15:51 |
| Проблему можно получить тогда, когда один из конструкторов статических объектов пытается получить доступ к данным другого статического объекта. Обычно, данная проблема оканчивается крахом приложения еще до входа в main(). |
| Автор: amnesiacorg 3.9.2012, 16:00 |
| Т.е. можно считать что задача сформулирована не правильно, потому что порядок линковки в данном случае никак не будет влиять на результат Mirror::test() для обьекта m5? |
| Автор: bsa 3.9.2012, 17:22 |
| amnesiacorg, да. |
| Автор: amnesiacorg 3.9.2012, 17:30 |
| Спасибо. |