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

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

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

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

10.08.2014, 00:10. Просмотров 1102. Ответов 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
gromo
371 / 270 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
10.08.2014, 01:18  [ТС] #16
Цитата Сообщение от DrOffset Посмотреть сообщение
Проблемы будут, если есть перекрестные ссылки между объектами в разных единицах трансляции.
До такого еще додуматься надо

Не по теме:

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

0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
10.08.2014, 01:23 #17
gromo, Tulosba, да в GCC, ключик -fpermissive возвращает поведение как у GCC 3, который позволял менять связывание у static переменной через extern. Надо бы разобрать причины.

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

Добавлено через 1 минуту
Цитата Сообщение от gromo Посмотреть сообщение
До такого еще додуматься надо
Достаточно иметь парочку синглтонов и даже думать не надо. Отчасти поэтому они являются сомнительным средством. Создают иллюзию безопасности (ну это кроме его других недостатков - сильной связности кода и опасности мутации в god object).
0
gromo
371 / 270 / 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
И все же должен был выдавать предупреждение, судя по описанию.
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
10.08.2014, 01:34 #19
gromo, на 100%, насколько мне известно, ни один компилятор не соответствует. Даже если есть 99.9% поддержки, все равно в стандарте находятся места, которые могли быть двусмысленно поняты или не до конца описаны (дефекты так называемые). Поэтому тут всегда есть опасность.

Добавлено через 45 секунд
Цитата Сообщение от gromo Посмотреть сообщение
-fpermissive в разделе диалектов С++
Этого ключа до версии 4, как мне кажется, вообще не было.
0
gromo
371 / 270 / 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.0.4/gcc_3.html#SEC3

Добавлено через 2 минуты
и gcc 2: https://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_2.html#SEC2
1
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
10.08.2014, 02:02 #21
Цитата Сообщение от gromo Посмотреть сообщение
Это понятно, но не в таких же жЫрных аспектах?
В 2.95.х были еще более жирные аспекты.

Добавлено через 6 минут
Цитата Сообщение от gromo Посмотреть сообщение
Был
Да уж. Ну значит я за 12 лет не встретил примеров нестандартного кода на gcc 2 и 3, которые бы его потребовали. А GCC 2 огромное количество нестандартного кода пропускает. Приходилось портировать программы написанные на 2.95 на более новые версии, ни с чем не сравнимые ощущения. Из серии "как это вообще могло работать".

Добавлено через 10 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
Это понятно, но не в таких же жЫрных аспектах?
Вот например, из того, что вспомнил про 2.95.
Можно было определять параметры по-умолчанию у функций и в определении и в объявлении.
Если у шаблонного класса был добавлен этот же шаблон в друзья (чтобы разные инстанции были друг другу друзьями), то этот код при инстанцировании выдавал internal compiler error. Вообще на ICE там частенько приходилось смотреть. Вот так.
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
10.08.2014, 14:17 #22
сколько демагогии, вместо придерживания простых правил: целочисленные константы значения которых известны на момент компиляции оформляем в enum, все прочее в функцию возвращающую const T& на static переменную определенную внутри функции

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
В пределах одной единицы трансляции порядок определен, если не собираешься использовать их из других глобальных объектов, то все будет хорошо.
скажи это тому кто будет работать с этим кодом через год месяц
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
10.08.2014, 19:48 #23
Цитата Сообщение от Jupiter Посмотреть сообщение
сколько демагогии
Хочется заметить что демагогия, в основном, не касалась первоначальной темы.
Предложенные тобой простые правила тоже не панацея. От перекрестных ссылок, если кто-то захочет, это не спасет: сохранит он себе не копию, а ссылку в другом глобальном объекте, а потом статический объект-владелец уничтожится и получим висячую ссылку. У enum тоже есть свои недостатки (в С++03) - это фиксированный тип значений. А вот мы совсем недавно налетали на такое: один и тот же enum с разными значениями в разных файлах. В одном куске программы одно поведение, в другом - совсем иное, на стыке - хаос и анархия.
Это я к тому, что правила хоть и хорошие (я с ними почти согласен), но субъективные. И ежели кто захочет нагадить, то у него получится, будь уверен.

Цитата Сообщение от Jupiter Посмотреть сообщение
скажи это тому кто будет работать с этим кодом через год месяц
Или я что-то пропустил, или в данной теме не было вопросов о сопровождаемости кода. Был исключительно технический вопрос. Я подразумеваю, что у автора своя голова на плечах и он знает что делает. Переубеждать всех, кто по моему мнению собирается делать что-то некорректное или опасное (в любых смыслах) я лично не собираюсь, и вряд ли хватит сил это делать, если соберусь. Так что тебе тоже не советую. В общем, если какие вопросы по поводу правильности такого подхода, то это к автору, а не ко мне.
0
gromo
371 / 270 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
10.08.2014, 22:00  [ТС] #24
Цитата Сообщение от Jupiter Посмотреть сообщение
целочисленные константы значения которых известны на момент компиляции оформляем в enum, все прочее в функцию возвращающую const T& на static переменную определенную внутри функции
я как раз хотел избежать этого:
Цитата Сообщение от gromo Посмотреть сообщение
Можно ли не городить Singleton для каждой константы?
я понимаю, что это не до конца singleton, но я хотел избежать этой дополнительной писанины с локальными статическими константами, обертыванием их в функцию и т.д.
0
gng
645 / 491 / 133
Регистрация: 08.09.2013
Сообщений: 1,326
11.08.2014, 21:56 #25
Цитата Сообщение от gromo Посмотреть сообщение
Забыл главное: будут ли все константы гарантированно инициализированы к моменту обращения к ним из разных единиц трансляции?
Да. Все константы и глобальные переменные инициализируются до вызова main(). Причем статическая инициализация (точнее - даже загрузка)
C++
1
int ival= 6;
предшествует динамической
C++
1
const SomeNonTrivialClass obj(...);
При инициализации obj можно использовать ival независимо от того, в каких модулях они описаны.
Последовательность динамической инициализации глобальных переменных, насколько я помню, не определина. Если у вас есть глобальнае obj1 и obj2, то при инициализации одного использовать другой не стоит.
Или я не понял, и вы имели в виду что-то другое?
0
gromo
371 / 270 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
11.08.2014, 23:06  [ТС] #26
Цитата Сообщение от gng Посмотреть сообщение
Последовательность динамической инициализации глобальных переменных, насколько я помню, не определина.
Выходит последовательность статической инициализации глобальных переменных также не определена, только она гарантированно происходит до динамической инициализации глобальных объектов?
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
11.08.2014, 23:37 #27
Цитата Сообщение от gromo Посмотреть сообщение
Выходит последовательность статической инициализации глобальных переменных также не определена, только она гарантированно происходит до динамической инициализации глобальных объектов?
А зачем тебе нужна это последовательность? Она ничего не дает.
А вот динамическая инициализация вполне определена:
Dynamic initialization of a non-local variable with static storage duration is either ordered or
unordered. Definitions of explicitly specialized class template static data members have ordered initializa-
tion. Other class template static data members (i.e., implicitly or explicitly instantiated specializations) have
unordered initialization. Other non-local variables with static storage duration have ordered initialization.
Variables with ordered initialization defined within a single translation unit shall be initialized in the order
of their definitions in the translation unit.
2
gng
645 / 491 / 133
Регистрация: 08.09.2013
Сообщений: 1,326
11.08.2014, 23:42 #28
Цитата Сообщение от gromo Посмотреть сообщение
Выходит последовательность статической инициализации глобальных переменных также не определена, только она гарантированно происходит до динамической инициализации глобальных объектов?
Я не эксперт в стандартах, но писать в глобальной секции одного си модуля
int a= 5;
а в глобальной секции другого
int b= a;
я бы не решился. Хотя, возможно, b в этом случае будет инициализирована динамически, или даже умный компаноновщик сможет отследить порядок статической инициализации и все будет OK.
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
11.08.2014, 23:44 #29
Цитата Сообщение от gng Посмотреть сообщение
писать в глобальной секции одного си модуля
То, что в разных модулях порядок инициализации не определен было сказано еще в начале темы. Он, как я понял, спрашивает про один модуль.
0
gng
645 / 491 / 133
Регистрация: 08.09.2013
Сообщений: 1,326
11.08.2014, 23:46 #30
PS. В рамках одного модуля, конечно, инициализация упорядочена.
0
11.08.2014, 23:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2014, 23:46
Привет! Вот еще темы с ответами:

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

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


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

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

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