|
5 / 5 / 4
Регистрация: 18.11.2014
Сообщений: 81
|
|
Как создать глобальную константу для всего проекта?20.11.2014, 22:43. Показов 15906. Ответов 24
Метки нет (Все метки)
0
|
|
| 20.11.2014, 22:43 | |
|
Ответы с готовыми решениями:
24
Как создать константу для нескольких файлов проекта Как создать глобальную константу для объекта Как объявить глобальную переменную для всего проекта? |
|
28 / 5 / 1
Регистрация: 18.11.2014
Сообщений: 68
|
|||||||||||
| 20.11.2014, 23:38 | |||||||||||
|
globalconst.hpp:
2
|
|||||||||||
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
|||||||
| 20.11.2014, 23:45 | |||||||
|
Для скалярных типов в С++ в заголовочном файле просто пишется
Но если вы где-то в программе будете брать адрес этой константы '&MY_GLOBAL_CONSTANT', то в разных модулях этот адрес будет разным. Это вас волнует? Если волнует, то делать следует так показал true_bugmaker. Но в этом случае константа не будет константой времени компиляции в тех модулях, в которых видно только ее объявление. Если тип вашей константы не скалярен ("тяжелый тип"), то опять же лучше поступить как показал true_bugmaker.
1
|
|||||||
|
28 / 5 / 1
Регистрация: 18.11.2014
Сообщений: 68
|
||
| 21.11.2014, 00:17 | ||
0
|
||
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
|||
| 21.11.2014, 00:29 | |||
|
Разумеется, надо следить за глобальностью констант и ограничивать ее до минимальной необходимости. Т.е. не совать в действительно глобальные заголовки то, что там не нужно.
0
|
|||
|
28 / 5 / 1
Регистрация: 18.11.2014
Сообщений: 68
|
|
| 21.11.2014, 00:48 | |
|
0
|
|
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
|||
| 21.11.2014, 01:02 | |||
|
Точно так же как определение 'static int i = 5;' в разных единицах трансляции не является нарушением ODR, определение 'const int j = 42;' в разных единицах трансляции не является нарушением ODR. В языке С++ для переменной в namespace scope 'const' эквивалентно 'static const'.
0
|
|||
|
28 / 5 / 1
Регистрация: 18.11.2014
Сообщений: 68
|
|
| 21.11.2014, 01:15 | |
|
0
|
|
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
||
| 21.11.2014, 01:58 | ||
|
Спецификация 'const' объектов целочисленных типов языка С++ специально разработана так, чтобы 'const int N = 42;' при правильном использовании мог выступать в качестве константы времени компиляции, т.е. в качестве замены для '#define N 42' из языка С. '#define' считается слишком грубым инструментом, так как не поддерживает типизации и не подчиняется областям видимости. В языке С++ (в отличии от С) разрешается использовать 'const' объекты целочисленных типов, например, для задания меток case, ширин битовых полей, размеров любых массивов, инициализаторов enum констант и т.п. Но чтобы 'const' объекты можно было использовать в такой роли глобально в проекте, их инициализаторы должны быть видны во всем проекте. Т.е. поступать придется именно так, как показано в моем примере и платить за это перекомпиляцией всего проекта при изменении значения константы. А если вам не нужно, чтобы ваша глобальная константа была константой времени компиляции, а была просто "неизменяемой переменной" (как это было в С), то можно пойти по вашему пути через 'extern const' в заголовочном файле.
0
|
||
|
28 / 5 / 1
Регистрация: 18.11.2014
Сообщений: 68
|
||
| 21.11.2014, 02:14 | ||
|
0
|
||
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
||
| 21.11.2014, 03:23 | ||
|
Вы, видимо, чего то не поняли. Мое объяснение выше не является каким-то трюком уровня специфического линкера. Концепции linkage (external linkage и internal linkage) - это языковые концепции, взятые непосредственно из спецификации языка. В спецификации языка нигде не сказано, что определение констант c internal linkage в заголовочном файле в С++ является нарушением ODR. Нет, не является и никогда не являлось. Ни в языке С, ни в языке С++ невозможно нарушить ODR путем определения объектов c internal linkage в разных единицах трансляции. Это, вообще то, азы объектной модели С и С++. Меня удивляет, что приходится тратить столько времени на объяснение такой элементарщины человеку, который в состоянии найти статью про ODR в Википедии. Зрителям: как думаете - тролль?
0
|
||
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
||
| 21.11.2014, 04:45 | ||
|
0
|
||
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
| 21.11.2014, 06:10 | |
|
TheCalligrapher, вообще подход true_bugmaker более предпочтителен, так как константы обычно заводят для того, чтобы можно было быстренько поменять их значение и проверить работу программы. И если константа будет определена в заголовочном файле, то придется перекомпилировать все модули, куда включается этот заголовочный файл. А если завести себе отдельный файл config.cpp с константами, то перекомпилять надо будет только его ну и заново слинковать естественно.
0
|
|
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
||
| 21.11.2014, 07:15 | ||
|
Ещё раз: константа, объявленная по методу 'extern const' НЕ является константой вообще. Это "неизменяемая переменная", а не константа. Она не может использоваться там, где язык С++ требует константу. Она не может использоваться для задания размера массивного типа, она не может использоваться в метках case, она не может использоваться как параметр шаблона, и т.д. и т.п. В дополнение к этому, 'extern const' значение не может напрямую участововать в оптимизациях времени компиляции. Другими словами в огромном количестве (или даже в подавляющем большинстве) языковых случаев такая ложная "константа" совершенно бесполезна. Если же вы работаете над какими-то гигантскими проектами, в которых настоящие константы не нужны, то конечно, для сокращения времени компиляции вам возможно лучше пользоваться подходом с 'extern const'. Но это какие-то очень специфические проекты. В большинстве реальных С++ проектов нужны настоящие константы, т.е. константы времени компиляции. Такие константы можно получить только одним способом - определением прямо в заголовочном файле. Поэтому рассуждать на тему того, какой способ "предпочтительнее", в большинстве случаев просто не приходится. Если вам нужна настоящая константа в терминологии языка С++, т.е. константа времени компиляции, то никакого выбора у вас нет - константа определяется именно так, как показал я. А то, что ваш проект будет долго перекомпилирваться - это неизбежные реалии языков С и С++. ============= В языке С, например, 'const' объекты вообще никогда не являются константами, где их не объявляй. Поэтому в языке С огромное количество именованных констант объявляется через '#define'. '#define' и 'enum' - это фактически единственные спосбы получить именованную константу времени компиляции в С.
1
|
||
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
| 21.11.2014, 19:33 | |
|
0
|
|
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
||
| 21.11.2014, 19:55 | ||
|
0
|
||
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|||||||||||
| 21.11.2014, 20:27 | |||||||||||
|
TheCalligrapher,
0
|
|||||||||||
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
||
| 21.11.2014, 20:46 | ||
|
Похоже они таки вошли. Однако их функциональность существенно урезана по сравнению с С VLA: "T is called the array element type; this type shall not be a reference type, the (possibly cv-qualified) type void, a function type, an array of unknown or runtime bound, or an abstract class type."
0
|
||
| 21.11.2014, 20:46 | |
|
Помогаю со студенческими работами здесь
20
Как объявить глобальную константу? Как qt создать глобальную переменную для двух классов? Как создать глобальную переменную для доступа из других файлов? Как сделать указатель глобальным для всего проекта? Как объявить переменную для доступа на уровне всего проекта Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|