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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Fasterbru
5 / 5 / 2
Регистрация: 18.11.2014
Сообщений: 81
#1

Как создать глобальную константу для всего проекта? - C++

20.11.2014, 22:43. Просмотров 1637. Ответов 24
Метки нет (Все метки)

как создать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2014, 22:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как создать глобальную константу для всего проекта? (C++):

Как правильно объявить константы для всего проекта, который состоит из нескольких файлов - C++
какой-нибудь Variables.h в котором будет что-то типа: #define A 50 #define B 40 или const int A 50

Как создать глобальную переменную? - C++
Создаю небольшой проект. Несколько функций и собственно тело программы. В теле объявил переменную int rep. Далее мне надо обратиться к ней...

Как правильно создать глобальную переменную? - C++
Как правильно создать глобальную переменную? Если она будет в заголовочном файле, то при подключении этого файла к другим cpp, эта...

Как лучше всего создать форму в С++ - C++
Хочу попробовать создать не консольную программу, а графическую. Как лучше всего создавать формы?

Как проще всего создать множество? - C++
Можно ли задать это множество как-то попроще? set<char> numbers; numbers.insert('0'); numbers.insert('1'); ...

Как создать release проекта в MS Visual Studio? - C++
Здравствуе. У меня Visual 2013 Компилирую простую программку, ставлю release #include "stdafx.h" #include <iostream> ...

24
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3899 / 2136 / 548
Регистрация: 18.10.2014
Сообщений: 3,749
21.11.2014, 07:15 #16
Цитата Сообщение от gromo Посмотреть сообщение
И если константа будет определена в заголовочном файле, то придется перекомпилировать все модули, куда включается этот заголовочный файл. А если завести себе отдельный файл config.cpp с константами,
Как уже было сказано мной выше, каждый подход имеет свои преимущества и недостатки. Если выбранный способ задания константы не подходит для ваших целей, то не важно быстро компилируется проект или нет.

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

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

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

=============

В языке С, например, 'const' объекты вообще никогда не являются константами, где их не объявляй. Поэтому в языке С огромное количество именованных констант объявляется через '#define'. '#define' и 'enum' - это фактически единственные спосбы получить именованную константу времени компиляции в С.
1
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
21.11.2014, 19:33 #17
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Она не может использоваться для задания размера массивного типа
Как оказалось, может. А в остальных случаях - согласен.
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3899 / 2136 / 548
Регистрация: 18.10.2014
Сообщений: 3,749
21.11.2014, 19:55 #18
Цитата Сообщение от gromo Посмотреть сообщение
Как оказалось, может
Нет, не оказалось. В С++ - не может. Я специально сослался именно на массивный тип, чтобы исключить из рассмотрения выражения типа 'new int[n]'. Размеры в массив-типах в С++ - только константы времени компиляции.
0
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
21.11.2014, 20:27 #19
TheCalligrapher,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// config.h
#include <cstddef>
extern const std::size_t c_size;
 
// config.cpp
#include "config.h"
const std::size_t c_size = 5u;
 
// main.cpp
#include "config.h"
int main()
{
    int iAr[c_size];
    return 0;
}
Bash
1
g++ -std=c++14 -Wpedantic -Wextra # Без GNUтых расширений к языку
ЧЯДНТ?
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3899 / 2136 / 548
Регистрация: 18.10.2014
Сообщений: 3,749
21.11.2014, 20:46 #20
Цитата Сообщение от gromo Посмотреть сообщение
ЧЯДНТ?
Вполне может быть, что вы правы. Я почему-то полагал, что run-time sized arrays были выкинуты из C++14 в последний момент. Но сейчас что-то навскидку не могу найти этому подтверждения...

Похоже они таки вошли. Однако их функциональность существенно урезана по сравнению с С 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
Somebody
2789 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 1
21.11.2014, 21:27 #21
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
"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."
Это откуда? Читаю n3936.pdf - про VLA ни слова. Кажется, VLA приняли как дополнение к стандарту или что-то типа того, но найти его не могу...
0
VIKT0R
9 / 9 / 2
Регистрация: 15.11.2011
Сообщений: 86
21.11.2014, 22:00 #22
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
const char *const MY_GLOBAL_STRING = "Hello";
Здесь опечатка?


А так можно написать в заголовочном файле?

C++
1
static char * GLOBAL_STRING = "hello";
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3899 / 2136 / 548
Регистрация: 18.10.2014
Сообщений: 3,749
21.11.2014, 22:30 #23
Цитата Сообщение от VIKT0R Посмотреть сообщение
Здесь опечатка?
Какая опечатка? Нет, там нет никаких опечаток.

Цитата Сообщение от VIKT0R Посмотреть сообщение
А так можно написать в заголовочном файле?
C++
1
static char * GLOBAL_STRING = "hello";
Почти.

Во-первых, именно с точки зрения ODR - разумеется, можно. Получится самостоятельная внутренняя переменная в каждой единице трансляции.

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

В-третьих, приведение типа строкового литерала к 'char *' в С++ уже запретили (в С++11), т.е. ваш код неправилен. Надо как минимум

C++
1
static const char * GLOBAL_STRING = "hello";
1
MrGluck
Модератор
Эксперт CЭксперт С++
7282 / 4443 / 650
Регистрация: 29.11.2010
Сообщений: 12,023
22.11.2014, 02:49 #24
Цитата Сообщение от gromo Посмотреть сообщение
константы обычно заводят для того, чтобы можно было быстренько поменять их значение и проверить работу программы.
Нет. Обычно они заводятся для того, чтобы явно назвать то или иное значение, а также для централизованного управления (чтобы задавать одинаковые параметры, размеры и т.д.)
0
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
22.11.2014, 03:58 #25
Цитата Сообщение от MrGluck Посмотреть сообщение
а также для централизованного управления (чтобы задавать одинаковые параметры, размеры и т.д.)
Это я и написал, только немного другими словами. То есть используя скилл "централизованное управление" быстренько меняем значение и смотрим на результат.
Забыл, правда, упомянуть про мнемонические названия, которые обретают магические числа, соотнеся мы их с константами, но это уже сделали вы.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2014, 03:58
Привет! Вот еще темы с ответами:

Как создать 2 проекта в одном solution в Visual Studio? - C++
В задании указано, что в solution должно быть 2 проекта, один чтобы читать данные, введенные с клавиатуры и записывать в бинарынй файл, а...

Где хранить глобальную переменную для всех представлений? - C++
я делаю MDI приложение с использованием БД мне нужно чтобы при запуске открывалась БД (CDatabase) а потом все формы использовали бы...

Как обьявить глобальную переменную - C++
Как объявить глобальную переменную Есть несколько *CPP* и *.h* файлы. Надо объявить переменную HWND hwnd чтобы она была доступна в...

Как обьявить глобальную переменную в функции? - C++
Вопрос как объявить переменную в функции чтобы ей можно было пользоваться везде?


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

Или воспользуйтесь поиском по форуму:
25
Yandex
Объявления
22.11.2014, 03:58
Ответ Создать тему
Опции темы

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