powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / про константы
25 сообщений из 41, страница 1 из 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
25 сообщений из 41, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / про константы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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