Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / про константы / 25 сообщений из 41, страница 1 из 2
31.08.2019, 18:15
    #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
31.08.2019, 18:25
    #39855998
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
про константы
Любую идею можно довести до абсурда. Поздравляю, Вам это удалось с модульностью/инкапсуляцией.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
31.08.2019, 19:17
    #39856002
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
про константы
полудух,
Разделить все на данные из базы (1000пар), конфиги и глобальные константы.

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

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


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


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

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

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

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

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

Если "раздать им всем const,", то не получится сконструировать "map на 1000 пар и прочие контейнеры".
Видимо, приличный вариант - это в cpp сделать static объекты, их заполнить, а вовне вынести extern const TYPE& (ссылку на константный объект).
...
Рейтинг: 0 / 0
03.09.2019, 14:59
    #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
03.09.2019, 15:13
    #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
03.09.2019, 15:15
    #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
03.09.2019, 15:17
    #39856702
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
про константы
ну ядолго и нудноа как быстро и весело?)))
...
Рейтинг: 0 / 0
03.09.2019, 15:18
    #39856705
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
про константы
ну я
Код: plaintext
1.
const int& MY_VAL = iMY_VAL;

а зачем ссыль?
Это я не понял.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / про константы / 25 сообщений из 41, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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