powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / про константы
41 сообщений из 41, показаны все 2 страниц
про константы
    #39855997
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут наткнулся на информационно-ёмкую тему по сабжу
выжимка:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
Это зависит от того, что имеется в виду под "глобальностью" и "константностью". Какого типа константа? Насколько "тяжел" этот тип?

Для скалярных типов в С++ в .h-файле просто пишется:
const int MY_GLOBAL_CONSTANT = 42;
const char *const MY_GLOBAL_STRING = "Hello";

и все. Вопрос закрыт.

Но если вы где-то в программе будете брать адрес этой константы '&MY_GLOBAL_CONSTANT', то в разных модулях этот адрес будет разным. Это вас волнует? Если волнует, то делать следует так 
показал true_bugmaker. Но в этом случае константа не будет константой времени компиляции в тех модулях, в которых видно только ее объявление.



В языке C++ (в отличие от С) явно инициализированные const объекты целочисленных типов образуют Integral Constant Expressions.
Это настолько ценное свойство целочисленных const объектов, что пожертвовать им мы не можем и ради него будем объявлять такие константы именно так, как я показал.
Разумеется, надо следить за глобальностью констант и ограничивать ее до минимальной необходимости. Т.е. не совать в действительно глобальные заголовки то, что там не нужно.



Я не вижу, какое отношение это может иметь к каким-то "тонкостям проекта". Это фундамент языков С и С++, который всегда присутствует во всех "проектах" без исключения.

Спецификация const объектов целочисленных типов языка С++ специально разработана так, чтобы 'const int N = 42;' при правильном использовании мог выступать в качестве константы времени
компиляции, т.е. в качестве замены для '#define N 42' из языка С. '#define' считается слишком грубым инструментом, так как не поддерживает типизации и не подчиняется областям видимости.

В языке С++ (в отличии от С) разрешается использовать const объекты целочисленных типов, например, для задания меток case, ширин битовых полей, размеров любых массивов, инициализаторов enum
констант и т.п. Но чтобы const объекты можно было использовать в такой роли глобально в проекте, их инициализаторы должны быть видны во всем проекте. Т.е. поступать придется именно так, как
показано в моем примере и платить за это перекомпиляцией всего проекта при изменении значения константы.

А если вам не нужно, чтобы ваша глобальная константа была константой времени компиляции, а была просто "неизменяемой переменной" (как это было в С), то можно пойти по вашему пути через
extern const в .h-файле.


объявление 'static int i = 5;' или 'const int j = 10;' в .h-файле не приводит к нарушению ODR и никогда нарушением ODR не являлось.


TheCalligrapher, вообще подход true_bugmaker более предпочтителен, так как константы обычно заводят для того, чтобы можно было быстренько поменять их значение и проверить работу программы.
И если константа будет определена в .h-файле, то придется перекомпилировать все модули, куда включается этот .h-файл.
А если завести себе отдельный файл config.cpp с константами, то перекомпилять надо будет только его, ну и заново слинковать естественно.



константа, объявленная по методу extern const НЕ является константой вообще. Это "неизменяемая переменная", а не константа. Она не может использоваться там, где язык С++ требует константу.
Она не может использоваться для задания размера массивного типа, она не может использоваться в метках case, она не может использоваться как параметр шаблона, и т.д. и т.п. В дополнение к
этому, extern const значение не может напрямую участововать в оптимизациях времени компиляции. Другими словами в огромном количестве (или даже в подавляющем большинстве) языковых случаев
такая ложная "константа" совершенно бесполезна.

Если же вы работаете над какими-то гигантскими проектами, в которых настоящие константы не нужны, то конечно, для сокращения времени компиляции вам возможно лучше пользоваться подходом с
extern const. Но это какие-то очень специфические проекты. В большинстве реальных С++ проектов нужны настоящие константы, т.е. константы времени компиляции. Такие константы можно получить
только одним способом - определением прямо в .h-файле.

Поэтому рассуждать на тему того, какой способ "предпочтительнее", в большинстве случаев просто не приходится. Если вам нужна настоящая константа в терминологии языка С++, т.е. константа
времени компиляции, то никакого выбора у вас нет - константа определяется именно так, как показал я. А то, что ваш проект будет долго перекомпилирваться - это неизбежные реалии языков С и С++.

В языке С, например, const объекты вообще никогда не являются константами, где их не объявляй. Поэтому в языке С огромное количество именованных констант объявляется через #define.
'#define' и enum - это фактически единственные способы получить именованную константу времени компиляции в С.


вопрос:
когда в проекте разного рода неизменяемые данные всплывают то там, то сям в некоторых файлах
например: map на 1000 пар и прочие контейнеры, одиночные значения, и т.д.
идеально ли раздать им всем const, завернуть в "namespace consts" И запихнуть всё в consts.h
потом подключить в main.cpp и, когда надо, дёргать consts::GLOBAL_CONST_VAR в любом месте проекта
?
...
Рейтинг: 0 / 0
про константы
    #39855998
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любую идею можно довести до абсурда. Поздравляю, Вам это удалось с модульностью/инкапсуляцией.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
про константы
    #39856002
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух,
Разделить все на данные из базы (1000пар), конфиги и глобальные константы.

полудухconsts::GLOBAL_CONST_VAR в любом месте проекта
?у меня именно так.
...
Рейтинг: 0 / 0
про константы
    #39856004
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЛюбую идею можно довести до абсурда. Поздравляю, Вам это удалось с модульностью/инкапсуляцией.
в чём абсурд?
PetroNotC Sharpполудух,
Разделить все на данные из базы (1000пар), конфиги и глобальные константы.
и каждому свой namespace ?
...
Рейтинг: 0 / 0
про константы
    #39856012
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухкаждому свой namespace ?какая переменная?
Если число пи, то одно на всех.
Если на один из проектов в решении, то уникальность в этих пределах.
Они же вложенные могут быть.
Вроде главное не засирать глобальное пространство имен).
...
Рейтинг: 0 / 0
про константы
    #39856113
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухв чём абсурд?
Запихнуть в один модуль сущности, не связанные между собой.

Это разновидность анти-паттерна God Object.
...
Рейтинг: 0 / 0
про константы
    #39856123
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет, когда про модули это понятно, что каждому модулю своё
...
Рейтинг: 0 / 0
про константы
    #39856135
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тема про константы или про модули?
Тут вроде как сам термин "модули" еще не устоялся чтобы про них говорить.
...
Рейтинг: 0 / 0
про константы
    #39856258
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухидеально ли раздать им всем


Озвучь критерий идеальности, пожалуйста.
...
Рейтинг: 0 / 0
про константы
    #39856290
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я что-то пропустил
а что, мапы уже в константы можно загнать? вот прямо что бы в Compile Time готовая структура образовалась без всяких лишних движений при инициализации?
...
Рейтинг: 0 / 0
про константы
    #39856316
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),
Ну загони парой строк кода из файла рядом с программа.exe.
Только странно список аэропортов или городов там держать без БД.
...
Рейтинг: 0 / 0
про константы
    #39856318
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivполудухидеально ли раздать им всем


Озвучь критерий идеальности, пожалуйста.
с т.з. правильно/не правильно
...
Рейтинг: 0 / 0
про константы
    #39856320
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharpkealon(Ruslan),
Ну загони парой строк кода из файла рядом с программа.exe.
Только странно список аэропортов или городов там держать без БД.
ну конфиги могут быть длинные
...
Рейтинг: 0 / 0
про константы
    #39856322
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC SharpТут вроде как сам термин "модули" еще не устоялся чтобы про них говорить.

Модуль - единица сборки. В текущем состоянии С++ это файл .cpp.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
про константы
    #39856333
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovВ текущем состоянии С++ это файл .cpp.понял)

полудухконфиги могут быть длинныене делайте длинными.
Они для админов.
...
Рейтинг: 0 / 0
про константы
    #39856379
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)я что-то пропустил
а что, мапы уже в константы можно загнать? вот прямо что бы в Compile Time готовая структура образовалась без всяких лишних движений при инициализации?

Можно.
https://github.com/serge-sans-paille/frozen
...
Рейтинг: 0 / 0
про константы
    #39856554
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharpполудухкаждому свой namespace ?какая переменная?
Если число пи, то одно на всех.
Если на один из проектов в решении, то уникальность в этих пределах.
Они же вложенные могут быть.
Вроде главное не засирать глобальное пространство имен).

нет единого числа Пи, его никто не видел. Для каждого свое в меру точности.
...
Рейтинг: 0 / 0
про константы
    #39856578
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин, попробуйте в 11-й раз по теме топика.
Контекст топика это модули и проект. А не все люди на планете.
...
Рейтинг: 0 / 0
про константы
    #39856579
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,
Вы не тянете на программирование в плюсах. Идите в шарп.
...
Рейтинг: 0 / 0
про константы
    #39856660
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух,

Если "раздать им всем const,", то не получится сконструировать "map на 1000 пар и прочие контейнеры".
Видимо, приличный вариант - это в cpp сделать static объекты, их заполнить, а вовне вынести extern const TYPE& (ссылку на константный объект).
...
Рейтинг: 0 / 0
про константы
    #39856683
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну я,
Так:
Код: plaintext
1.
2.
3.
4.
5.
6.
//globals.h
namespace Glob{
   extern int MY_VAL;
//globals.cpp
namespace Glob{
      int MY_VAL =123;


?
...
Рейтинг: 0 / 0
про константы
    #39856698
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
//globals.h
namespace Glob{
   extern const int& MY_VAL;

//globals.cpp
namespace Glob{
      int iMY_VAL = 123; // тут много действий
      const int& MY_VAL = iMY_VAL;



Внутри cpp долго и нудно инитишь статичную для модуля iMY_VAL, наружу показываешь ссылку на константный объект.
...
Рейтинг: 0 / 0
про константы
    #39856701
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опечатался со static
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
//globals.h
namespace Glob{
   extern const int& MY_VAL;

//globals.cpp
namespace Glob{
      static int iMY_VAL = 123; // тут много действий
      const int& MY_VAL = iMY_VAL;
...
Рейтинг: 0 / 0
про константы
    #39856702
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну ядолго и нудноа как быстро и весело?)))
...
Рейтинг: 0 / 0
про константы
    #39856705
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну я
Код: plaintext
1.
const int& MY_VAL = iMY_VAL;

а зачем ссыль?
Это я не понял.
...
Рейтинг: 0 / 0
про константы
    #39856796
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharpну я
Код: plaintext
1.
const int& MY_VAL = iMY_VAL;

а зачем ссыль?
Это я не понял.
Потому что вместо int в реальном коде требуется "map на 1000 пар и прочие контейнеры", а такие надо инитить только через конструктор копирования из уже подготовленного контейнера, а там "на 1000 пар и прочие". Двойные прогоны - оно конечно, но все же не гуд. А так имеем объект который изнутри менять можем, а снаружи можем только сослаться как на константный.
Или мсье одарен не понять любое слово?
...
Рейтинг: 0 / 0
про константы
    #39856811
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну я,
Я же пример простых типов приводил. Так?
И для простых типов он верный. Так?
А глобальная переменная для класса это оксюморон.
Для мапов, векторов и т.д. этот пример не катит.
...
Рейтинг: 0 / 0
про константы
    #39856832
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну яреальном коде требуется "map на 1000 пар и прочие контейнеры", ау меня грузится контейнер сцены (треугольники) из двоичного файла.
Не знаю зачем автор совместил в вопросе все подряд.
Разные подходы, код и паттерны..
...
Рейтинг: 0 / 0
про константы
    #39857665
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharpну я
Код: plaintext
1.
const int& MY_VAL = iMY_VAL;


а зачем ссыль?
Это я не понял. Тут более подробно раскрыта тема, и её подводные камни
...
Рейтинг: 0 / 0
про константы
    #39857681
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,
Ок.
В сухом остатке,
у меня на 20 глобальных констант это 40 строчек кода.
Если для флага ТолькоЧтение требуется сделать 60 строк вместо 40, то я это делать не буду. Оверхед.
От всего не защитится.
А если кто переопределит константу большими буквами (число Пи), тот сам себе ССЗБ.
Со второй стороны, я же могу просто обернуть сразу все 20 структурой const и вопрос решен.
С третьей стороны, добавление указателя не защитит ведь от его обнуления?
Glob::MY_VAL_PTR = NULL.
Imho
...
Рейтинг: 0 / 0
про константы
    #39857853
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сферические константы в вакууме ты можешь оборачивать чем угодно. Но реальные константы
обычно принадлежат вполне конкретным сущностям и сваливать их в братскую могилу только
добавляет бардака.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
про константы
    #39857859
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovСферические константы в вакууме ты можешь оборачивать чем угодно. Но реальные константы
обычно принадлежат вполне конкретным сущностям и сваливать их в братскую могилу только
добавляет бардака.вроде ты свалил, а не я.
Пример был про namespace Globals и модуль globals.h.
Это реальный проект.
У вас таких нет?
Мне жаль.
Зы. Константы сущностей лежат в классе и модуле этой сущности.
...
Рейтинг: 0 / 0
про константы
    #39857861
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC SharpЭто реальный проект.
У вас таких нет?
Мне жаль.Что же вас всех тянет на глобальные обобщения по результатам обзора своего местечкого болотца???
...
Рейтинг: 0 / 0
про константы
    #39857864
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorovболотцаобобщили?
Лучше код давайте.
А о том что константы сущностей не должны быть раскиданы, это СЕМЬ сказал)))).
Вы его ссылку почитайте.
Конретнее давайте)
...
Рейтинг: 0 / 0
про константы
    #39857870
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC SharpПример был про namespace Globals и модуль globals.h.
Это реальный проект.
У вас таких нет?

Были в унаследованном проекте. Больше нет: расползлись по осмысленным местам в результате
реструктуризации спагетти-кода в ООД.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
про константы
    #39857887
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovPetroNotC SharpПример был про namespace Globals и модуль globals.h.
Это реальный проект.
У вас таких нет?

Были в унаследованном проекте. Больше нет: расползлись по осмысленным местам в результате
реструктуризации спагетти-кода в ООД.ну мы же не максималисты?
Конечно глобальные это зло.
Но практически во всех либах я вижу _несколько_ глобальных на всю либу.
Иначе ждём ТСа про какие константы он вообще вещает.
...
Рейтинг: 0 / 0
про константы
    #39857891
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
Кстати глобальные у меня появились после замены их из #define в старом проекте.
Как то тут выяснял что это правильно в плюсах.
...
Рейтинг: 0 / 0
про константы
    #39858234
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovБольше нет: расползлись по осмысленным местам в результате
реструктуризации спагетти-кода в ООД.У нас как-то так же. Глобальных констант нет, все сидят в тематических местах, namespace-ах или классах.
PetroNotC SharpКонечно глобальные это зло.Это просто не совсем удобно. Я бы не стал вешать ярлыки "зло" на какие-то языковые конструкции и методологии, это всегда порождает неправильную реакцию у многих людей: они сразу принимают это на веру, что ведёт к другим печальным последствиям. Важно понимать, почему это неудобно: открываешь проект через пять лет, видишь константу, даже с понятным именем, но всё равно сложно понять, зачем она, где описана и где используется. Когда она в коде торчит из конкретного namespace, объекта или класса - это более понятно. А ещё можно использовать более простые имена.
...
Рейтинг: 0 / 0
про константы
    #39858241
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,
Я согласен что ПРОСТО КОНСТАНТА БЕЗ namespace это крайне неудобно.
У меня ни одной такой.
В java сам язык не позволяет такую завести.
Под термином "глобальная константа" предлагаю в топике считать те что в отдельном файле на весь проект и в namespace.

Если вы не против.
Или еще кто то остался по старому?))
...
Рейтинг: 0 / 0
про константы
    #39858243
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbони сразу принимают это на веруна веру счас никто не принимает. Особенно молодёжь)
...
Рейтинг: 0 / 0
про константы
    #39858435
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Тема закрыта
...
Рейтинг: 0 / 0
41 сообщений из 41, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / про константы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]