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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
gromo
371 / 270 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
#1

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

10.08.2014, 00:10. Просмотров 1095. Ответов 38
Метки нет (Все метки)

Безопасно ли такое использование:
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 для каждой константы?

Не по теме:

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



Забыл главное: будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2014, 00:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции (C++):

Как будут инициализированы переменные в теле функции и вне тела функции? - C++
Здравствуйте. Подскажите, пожалуйста, как будут инициализированы переменные в теле функции и вне тела функции? Какими значениями? ...

.NET 4.x Подождать пока все контролы на форме не будут инициализированы - C# WPF
Проблема следующая: Есть к примеру 2 TextBox К одному из них прикручено событие &quot;Textchanged&quot;. private void...

Как создавать файлы, которые будут подгружаться по мере обращения к ним? - Visual Basic
У меня приложение занимает 120 kb, при том что программа в целом будет весить не более 800 kb, и вообще я хотел бы знать как создавать...

Какие шрифты гарантированно будут у пользователя(CSS:font-family) - HTML, CSS
Вопрос к опытным разработчикам: какие шрифты безопаснее всего писать в этом атрибуте CSS? Не хочу попасть в ситуацию когда нужного шрифта...

формы и обращения к ним - C++
люди как создать 2-ю форму ну хочу чтоб у мя в проге было больше 1-го окна и как к ней над будь обращаться ведь к главной я обращаюсь так...

Код создания N-го колва checkBox'ов и обращения к ним - C#
Необходимо добавить на форму N-ое количество элементов checkBox. После изменения состояния этих елементов(true/false) определить какие из...

38
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
10.08.2014, 00:30 #2
Цитата Сообщение от gromo Посмотреть сообщение
будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции?
Если обращение будет из других глобальных объектов, то нет. Т.к. порядок создания глобальных объектов в разных единицах трансляции не определен. Порядок разрушения, соответственно, тоже.
Цитата Сообщение от gromo Посмотреть сообщение
Можно ли не городить Singleton для каждой константы?
Можно.
1
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
10.08.2014, 00:38 #3
Попутно залез в тему http://alenacpp.blogspot.ru/2011/07/blog-post_12.html и в ссылающуюся оттуда http://www.parashift.com/c++-faq-lite/static-init-order.html В обоих случаях упоминаются статические глобальные переменные и ссылки друг на друга. Но ведь статическая глобальная переменная не видна в другой единице трансляции. Я туплю и пора спать или в чем дело?
0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
10.08.2014, 00:45 #4
Цитата Сообщение от Tulosba Посмотреть сообщение
Но ведь статическая глобальная переменная не видна в другой единице трансляции.
Не видна, если у нее нет extern. Если мы написали extern, то прилепили ей внешнее связывание. Ссылку на стандарт искать лень, но она есть. У констант, кстати, внутреннее связывание по-умолчанию. Так что тут ситуация практически идентичная.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
10.08.2014, 00:47 #5
DrOffset, примерчик накатать можешь? Я что-то не понял, где должен быть extern. И в чем тогда смысл static.
0
gromo
371 / 270 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
10.08.2014, 00:49  [ТС] #6
Цитата Сообщение от Tulosba Посмотреть сообщение
Но ведь статическая глобальная переменная не видна в другой единице трансляции.
Тут есть некоторая путаница. Просто у обычных глобальных объектов статическая продолжительность жизни (они разрушаются только по завершении программы), но они не являются статическими переменными, т.е. объявлены без ключевого слова static.
Многие авторы смешивают статические глобальные объекты и просто глобальные объекты, называя их "static global objects" из-за того, что у обоих статическое расположение в памяти.
0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
10.08.2014, 00:51 #7
Tulosba, прочитал темы, похоже там не про extern речь. При static действует внутреннее связывание, но никто не запрещает каким-либо образом передать ссылку или указатель за пределы единицы трансляции. Видимо там как раз такой случай рассматривается.
0
gromo
371 / 270 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
10.08.2014, 00:52  [ТС] #8
DrOffset, я просто решил собрать константы в одном файле ( типа конфиг-файл такой ). Это единственное место в программе, где у меня есть глобальные объекты. Сл-но я так понимаю это вполне безопасно?
Да и ни разу не было никаких проблем, связанных с этим. Я просто решил уточнить, чтобы не было сюрпризов в будущем.
0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
10.08.2014, 00:54 #9
Цитата Сообщение от Tulosba Посмотреть сообщение
DrOffset, примерчик накатать можешь? Я что-то не понял, где должен быть extern. И в чем тогда смысл static.
Да я же ссылки не смотрел, изначально про другое подумал вообще. см. выше, короче.
Или даже gromo тут прав больше других. Скорее всего.

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

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

Не по теме:

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

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

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

Не по теме:

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

0
10.08.2014, 01:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2014, 01:15
Привет! Вот еще темы с ответами:

Получить все n-элементные последовательности из нулей и единиц содержащие ровно m единиц (m<=n) - C++
Получить все n-элементные последовательности из нулей и единиц содержащие ровно m единиц (m&lt;=n) Помогите, пожалуйста

Многократные обращения к imap c разных почтовых ящиков - Python
Немного не в тему но не нашел подходящего раздела, а так реализовал на питоне написал сюда. Скажите IMAP при неоднократном обращении блочит...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru