Форум программистов, компьютерный форум CyberForum.ru

Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции - C++

Восстановить пароль Регистрация
 
 
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
10.08.2014, 00:10     Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции #1
Безопасно ли такое использование:
C++
1
2
3
4
5
6
7
8
9
10
11
// config.cpp
const int ival = 6;
const SomeNonTrivialClass obj(...);
 
// config.h
extern const int ival;
extern const SomeNonTrivialClass obj;
 
// some_source_file.cpp
#include "config.h"
void func() { std::cout << obj << ival;   }
То есть мне нужны просто константы, не статические, собранные в одном файле и которые можно использовать по всей программе. Можно ли не городить Singleton для каждой константы?

Не по теме:

Знаю вопрос тупой, но я запутался что-то



Забыл главное: будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2014, 00:10     Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции
Посмотрите здесь:

C++ Вывести на экран содержимое файла с программой на С, подсвечива другим цветом все восьмеричные константы.
C++ формы и обращения к ним
Подсчитать кол-во единиц в числе, кроме единиц в младших разрядах. [CPP] C++
Получить все n-элементные последовательности из нулей и единиц содержащие ровно m единиц (m<=n) C++
C++ Напечатать все значения n, при которых все числа последовательности будут не меньше а
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,626
10.08.2014, 00:30     Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции #2
Цитата Сообщение от gromo Посмотреть сообщение
будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции?
Если обращение будет из других глобальных объектов, то нет. Т.к. порядок создания глобальных объектов в разных единицах трансляции не определен. Порядок разрушения, соответственно, тоже.
Цитата Сообщение от gromo Посмотреть сообщение
Можно ли не городить Singleton для каждой константы?
Можно.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.08.2014, 00:38     Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции #3
Попутно залез в тему http://alenacpp.blogspot.ru/2011/07/blog-post_12.html и в ссылающуюся оттуда http://www.parashift.com/c++-faq-lit...nit-order.html В обоих случаях упоминаются статические глобальные переменные и ссылки друг на друга. Но ведь статическая глобальная переменная не видна в другой единице трансляции. Я туплю и пора спать или в чем дело?
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,626
10.08.2014, 00:45     Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции #4
Цитата Сообщение от Tulosba Посмотреть сообщение
Но ведь статическая глобальная переменная не видна в другой единице трансляции.
Не видна, если у нее нет extern. Если мы написали extern, то прилепили ей внешнее связывание. Ссылку на стандарт искать лень, но она есть. У констант, кстати, внутреннее связывание по-умолчанию. Так что тут ситуация практически идентичная.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.08.2014, 00:47     Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции #5
DrOffset, примерчик накатать можешь? Я что-то не понял, где должен быть extern. И в чем тогда смысл static.
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
10.08.2014, 00:49  [ТС]     Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции #6
Цитата Сообщение от Tulosba Посмотреть сообщение
Но ведь статическая глобальная переменная не видна в другой единице трансляции.
Тут есть некоторая путаница. Просто у обычных глобальных объектов статическая продолжительность жизни (они разрушаются только по завершении программы), но они не являются статическими переменными, т.е. объявлены без ключевого слова static.
Многие авторы смешивают статические глобальные объекты и просто глобальные объекты, называя их "static global objects" из-за того, что у обоих статическое расположение в памяти.
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,626
10.08.2014, 00:51     Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции #7
Tulosba, прочитал темы, похоже там не про extern речь. При static действует внутреннее связывание, но никто не запрещает каким-либо образом передать ссылку или указатель за пределы единицы трансляции. Видимо там как раз такой случай рассматривается.
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
10.08.2014, 00:52  [ТС]     Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции #8
DrOffset, я просто решил собрать константы в одном файле ( типа конфиг-файл такой ). Это единственное место в программе, где у меня есть глобальные объекты. Сл-но я так понимаю это вполне безопасно?
Да и ни разу не было никаких проблем, связанных с этим. Я просто решил уточнить, чтобы не было сюрпризов в будущем.
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,626
10.08.2014, 00:54     Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции #9
Цитата Сообщение от Tulosba Посмотреть сообщение
DrOffset, примерчик накатать можешь? Я что-то не понял, где должен быть extern. И в чем тогда смысл static.
Да я же ссылки не смотрел, изначально про другое подумал вообще. см. выше, короче.
Или даже gromo тут прав больше других. Скорее всего.

Добавлено через 1 минуту
Цитата Сообщение от gromo Посмотреть сообщение
я просто решил собрать константы в одном файле ( типа конфиг-файл такой ). Это единственное место в программе, где у меня есть глобальные объекты.
В твоем случае каких-либо проблем не вижу. В пределах одной единицы трансляции порядок определен, если не собираешься использовать их из других глобальных объектов, то все будет хорошо.
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
10.08.2014, 01:00  [ТС]     Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции #10
Цитата Сообщение от DrOffset Посмотреть сообщение
Не видна, если у нее нет extern
Кстати если переменная действительно статическая (с ключевым словом static), то ее объявление с extern приведет к ошибке.
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,626
10.08.2014, 01:02     Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции #11
Цитата Сообщение от Tulosba Посмотреть сообщение
Я что-то не понял, где должен быть extern. И в чем тогда смысл static.
Похоже это мне спать пора Глупость я написал. Если есть static, то связывание через extern переменной сменить нельзя (а константе можно). Хотя некоторые компиляторы это позволяли раньше.
Так что забей. Алена тоже все неправильно поняла, а gromo все-таки прав.

Добавлено через 47 секунд
Цитата Сообщение от gromo Посмотреть сообщение
Кстати если переменная действительно статическая (с ключевым словом static), то ее объявление с extern приведет к ошибке.
Да да. На волне твоего примера с константами написал не подумав
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
10.08.2014, 01:03  [ТС]     Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции #12
Tulosba, вот, например, выдержка из правила 4 у Мейерса (и как пример смешения терминологии):
Статический объект существует от момента, когда был сконструирован, и до конца работы программы. Объекты, размещенные в стеке и в «куче», к статическим не относятся. Статическими являются глобальные объекты, объекты, объявленные в области действия пространства имен, объекты, объявленные с ключевым словом static внутри классов и функций, а также в области действия отдельного файла с исходным текстом. Статические объекты, объявленные внутри функций, известны как локальные статические объекты (поскольку они локальны по отношению к функции), а все прочие называют нелокальными статическими объектами. Статические объекты автоматически уничтожаются при завершении программы, то есть при выходе из функции main() автоматически вызываются их деструкторы.
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,626
10.08.2014, 01:07     Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции #13
gromo, а вот это, кстати, наглядно показывает косяки перевода. Правильно было бы "объекты со статическим размещением" (static storage duration).
gromo
10.08.2014, 01:10  [ТС]
  #14

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
static storage duration
А я все никак не мог вспомнить это словосочетание

DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,626
10.08.2014, 01:15     Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции #15
Цитата Сообщение от gromo Посмотреть сообщение
Да и ни разу не было никаких проблем, связанных с этим.
Проблемы будут, если есть перекрестные ссылки между объектами в разных единицах трансляции. Например если в деструкторе одного дергается метод другого. Может быть, что второй объект уже уничтожился. Обычный синглтон тут тоже кстати не спасет. У Александреску в книге был пример специального синглтона - феникса, который решал эту проблему. Правда с побочными эффектами.

Добавлено через 2 минуты

Не по теме:

Цитата Сообщение от gromo Посмотреть сообщение
А я все никак не мог вспомнить это словосочетание
Мысли вслух: надо больше спать и читать книги в оригинале.

gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
10.08.2014, 01:18  [ТС]     Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции #16
Цитата Сообщение от DrOffset Посмотреть сообщение
Проблемы будут, если есть перекрестные ссылки между объектами в разных единицах трансляции.
До такого еще додуматься надо

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
У Александреску в книге был пример специального синглтона - феникса, который решал эту проблему.
А он не планирует выпустить новую редакцию книги с учетом нового стандарта? Знаю, что полезно и старую прочитать и понять, но все же.

DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,626
10.08.2014, 01:23     Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции #17
gromo, Tulosba, да в GCC, ключик -fpermissive возвращает поведение как у GCC 3, который позволял менять связывание у static переменной через extern. Надо бы разобрать причины.

Добавлено через 2 минуты
Цитата Сообщение от gromo Посмотреть сообщение
А он не планирует выпустить новую редакцию книги с учетом нового стандарта? Знаю, что полезно и старую понять, но все же.
Он сейчас в D ударился, так что не уверен, если честно.

Добавлено через 1 минуту
Цитата Сообщение от gromo Посмотреть сообщение
До такого еще додуматься надо
Достаточно иметь парочку синглтонов и даже думать не надо. Отчасти поэтому они являются сомнительным средством. Создают иллюзию безопасности (ну это кроме его других недостатков - сильной связности кода и опасности мутации в god object).
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
10.08.2014, 01:30  [ТС]     Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции #18
Цитата Сообщение от DrOffset Посмотреть сообщение
ключик -fpermissive возвращает поведение как у GCC 3, который позволял менять связывание у static переменной через extern
Получается GCC 3 не соответствовал стандарту. -fpermissive в разделе диалектических опций gcc: https://gcc.gnu.org/onlinedocs/gcc-4...t-Options.html
И все же должен был выдавать предупреждение, судя по описанию.
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,626
10.08.2014, 01:34     Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции #19
gromo, на 100%, насколько мне известно, ни один компилятор не соответствует. Даже если есть 99.9% поддержки, все равно в стандарте находятся места, которые могли быть двусмысленно поняты или не до конца описаны (дефекты так называемые). Поэтому тут всегда есть опасность.

Добавлено через 45 секунд
Цитата Сообщение от gromo Посмотреть сообщение
-fpermissive в разделе диалектов С++
Этого ключа до версии 4, как мне кажется, вообще не было.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2014, 01:43     Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции
Еще ссылки по теме:

C++ Вывести все значения n, при которых все числа заданной последовательности будут не меньше "a"
В строке, состоящей из групп нулей и единиц, подсчитать количество единиц в группах с нечетным количеством C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
10.08.2014, 01:43  [ТС]     Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции #20
Цитата Сообщение от DrOffset Посмотреть сообщение
на 100%, насколько мне известно, ни один компилятор не соответствует
Это понятно, но не в таких же жЫрных аспектах?
Цитата Сообщение от DrOffset Посмотреть сообщение
Этого ключа до версии 4, как мне кажется, вообще не было.
Был, вот gcc 3 https://gcc.gnu.org/onlinedocs/gcc-3...cc_3.html#SEC3

Добавлено через 2 минуты
и gcc 2: https://gcc.gnu.org/onlinedocs/gcc-2...cc_2.html#SEC2
Yandex
Объявления
10.08.2014, 01:43     Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции
Ответ Создать тему
Опции темы

Текущее время: 16:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru