Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
2 / 2 / 0
Регистрация: 29.05.2024
Сообщений: 62

Конфигурация исполняемой программы

15.05.2025, 15:04. Показов 9875. Ответов 64

Студворк — интернет-сервис помощи студентам
Добрый день, уважаемое сообщество.

Поделитесь, пожалуйста, тем как вы организуете получение и хранение конфигурационной информации.
Я здесь сознательно выделил два вопроса. Один вопрос, как хранить конфигурационную информацию на уровне файлов. И второй вопрос, как хранить конфигурационную информацию на уровне исполняемого кода.

На уровне файлов я использую два подхода. В одном подходе, я храню конфигурационную инфу в файле main.h и инклюжу его внутри main.cpp. Во втором подходе, я храню инфу в файле config.ini и как-то считываю этот файл.
Решение о том, какую конфигурационную инфу, куда закидывать, принимаю исходя из того, как часто приходится её менять в ходе разработки и тестирования кода. Если часто меняю - то в config.ini, если редко - то в main.h. Это делается, чтобы не делать всякий раз пересборку проекта, если поменял путь к какому-то входному или выходному файлу. Поэтому задаюсь вопросом, а почему бы всю инфу не хранить в config.ini? И отвечаю себе так, вот мне недавно книжку Агнера Фога посоветовали, так он всю конфиг инфу в main.h закидывает и не парится. Т.е. наоборот никаких config.ini он не использует.
Вот пример его кода из файла main.h

main.h
C++
1
2
3
4
5
6
7
8
9
10
11
/******************************************************************************
*                        named values
******************************************************************************/
 
// varType values
const int varInt8            = 1;      // 8 bit signed integer
const int varInt16           = 2;      // 16 bit signed integer
const int varInt32           = 3;      // 32 bit signed integer
const int varInt64           = 4;      // 64 bit signed integer
const int varFloat           = 9;      // 32 bit float
const int varDouble          = 10;     // 64 bit double precision float
Поэтому резюмирую первый вопрос, как на уровне файлов грамотно хранить конфигурационную информацию (конфиг), т.е. инфу, которая не меняется в ходе исполнения программы?

Второй вопрос, как организовать хранение конфига на уровне исполняемого кода.
Я тут использую несколько способов.
1. Использую namespace. Это такой способ шифрануть глобальные константы внутрь namespace, чтобы избежать конфликтов.
2. Использую статические поля структур/классов.
Глобальные константы не использовал, т.к. начитался, что это зло. А смотрю код у этого же Фога и там сплошь и рядом глобальные константы без угрызений совести, и даже без namespace. Поэтому я засомневался в своих взглядах на глобальные константы.
А есть ещё такие конфигурационные данные, которые на момент запуска программы не известны, т.е. их не засунешь ни в config.ini, ни в main.h, но они вычисляются в начале программы и не меняются в течение всей программы, например, время запуска программы. Сейчас я их храню в namespace, но уже сомневаюсь в правильности такого подхода.

Поэтому резюмирую второй вопрос, как на уровне переменных вы храните конфигурационную информацию?

Заранее спасибо за ответы.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.05.2025, 15:04
Ответы с готовыми решениями:

Имя и путь исполняемой программы
1. Как получить полное имя (путь+имя+расширение) исполняемой программы? В Borland это было...

Превращение строки в название исполняемой функции
Доброго времени суток. Появился вопрос. Предположим есть TextBox, кнопка и набор функций: void...

""D:\"" не является внутренней или внешней командой, исполняемой программой или пакетным файлом
Только начал изучать С++, и уже в самом начале напоролся на ошибку. Перерыл весь гугл, ответа не...

64
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
15.05.2025, 18:26
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Alex_Solo_Mars Посмотреть сообщение
Ок. А как тогда назвать например путь к выходному файлу "output.txt" ?
Это называется ресурс. Если данные нужно отделить от программы/модуля.
Он может хранится отдельным файлом в т.ч. в dll.

Если же данные не нужно отделять, то есть, они участвуют в компиляции. Такие как константы, шаблоны и т.д.
Можно выделить в отдельную сущность Config.

Цитата Сообщение от Alex_Solo_Mars Посмотреть сообщение
А смотрю код у этого же Фога и там сплошь и рядом глобальные константы без угрызений совести, и даже без namespace.
Это учебный материал, нужно делать на это скидку. И читать аннотации к книге/разделам где автор может написать "что это лишь для простоты изложения материала".
0
2 / 2 / 0
Регистрация: 29.05.2024
Сообщений: 62
15.05.2025, 18:50  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Это называется ресурс. Если данные нужно отделить от программы/модуля.
Подождите секунду. Речь идёт о том где хранить путь к файлу, а не сам файл. В этом вопрос.
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,217
15.05.2025, 18:51
Должен генерироваться экзешником с дефолтными настройками.
Если имеешь желание, должно быть можно что то изменить.
Если пропадёт, должен появиться снова.
Хотя у каждого свой вкус, сказал индус...
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
15.05.2025, 18:54
Цитата Сообщение от Alex_Solo_Mars Посмотреть сообщение
Речь идёт о том где хранить путь к файлу,
Да, строки можно хранить в ресурсах.
Опять же, при условии что они не используются в компиляции, а лишь в рантайме.
Я об этом специально поставил акцент.

То есть, вы намешали две разные задачи.
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,217
15.05.2025, 18:57

По умолчанию там буковка C. Такая есть у всех...
По желанию можно поменять на диск , где места много.
0
2 / 2 / 0
Регистрация: 29.05.2024
Сообщений: 62
15.05.2025, 19:48  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
То есть, вы намешали две разные задачи.
Я вроде как и сформулировал два разных вопроса.
Один вопрос, как лучше хранить неизменяемую информацию на уровне файлов.
Второй вопрос, как лучше хранить неизменяемую информацию на уровне переменных.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
15.05.2025, 20:12
Цитата Сообщение от Alex_Solo_Mars Посмотреть сообщение
Я вроде как и сформулировал два разных вопроса.
Так я на них и ответил.
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,217
15.05.2025, 21:46
Цитата Сообщение от Alex_Solo_Mars Посмотреть сообщение
неизменяемую информацию
Это какую? И про что программа? Что урабатывать, и что хранить?
Очень умно пишите. Не все такие умные. Я например не очень...
0
2 / 2 / 0
Регистрация: 29.05.2024
Сообщений: 62
15.05.2025, 21:54  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Так я на них и ответил.
Я не хочу показаться навязчивым, но не могли бы вы ответить ещё раз. Я задам эти два вопроса по отдельности, чтобы избежать путаницы.
В ходе исполнения программы мне надо знать строку "C:\my_project\input\**********.txt ".
Вопрос: В каком файле, в каком месте диска, короче, где я храню эту информацию? Имеется в виду не где находится файл *************.txt , а где находится строка "C:\my_project\input\*************.t xt". Откуда я могу её прочитать?

Добавлено через 3 минуты
Цитата Сообщение от Наталья8 Посмотреть сообщение
Это какую?
Например, время запуска программы. Как легко заметить, эта информация не изменяется в ходе исполнения программы.
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,217
15.05.2025, 21:56
Цитата Сообщение от Alex_Solo_Mars Посмотреть сообщение
на уровне файлов
На уровне файлов, это на уровне чего?
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,217
15.05.2025, 22:05
Как желаешь так и храни.
Главное что бы твоя программа была полезна людям.
И если будешь не так хранить тебя простят.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
15.05.2025, 22:12
Лучший ответ Сообщение было отмечено Alex_Solo_Mars как решение

Решение

Цитата Сообщение от Alex_Solo_Mars Посмотреть сообщение
Вопрос: В каком файле, в каком месте диска, короче, где я храню эту информацию? Имеется в виду не где находится файл ************.txt , а где находится строка "C:\my_project\input\**************. tx t". Откуда я могу её прочитать?
Ну вот. Есть два основных случая :

1. Это константа и она никогда не изменяется.

Тогда она хранится в том месте где используется, в том же контексте, внутри той же сущности.

C++
1
2
3
struct MyFileInstrument{
   static constexpr std::string filename = "myfiele.txt";
};
2. Вам нужно дать пользователю изменять её до момента запуска приложения.
Внешний файл.

Сущность которая будет использовать это значение, уже не будет её у себя держать.
Будет принимать строку методом/конструктором.

3. Запрос у пользователя во время выполнения. Поведение как и во втором случае.

Глобальных хиромантий быть должно по минимуму.

Если у вас предвидится много общих данных.
Так и создайте отдельную сущность, о которой я и упоминал.

C++
1
2
3
4
5
6
class GlobalEnviroment{
public:
   const std::string& get(const std::string& name){
      
  }
};
Можно развить до разных типов. Список возможных типов заранее известный.
Вплоть до constexpr.

Запихать константы в неймспейс ничуть не лучше чем в глобальном пространстве.
1
 Аватар для volodin661
7092 / 2323 / 352
Регистрация: 10.12.2013
Сообщений: 8,005
15.05.2025, 22:21
Цитата Сообщение от Alex_Solo_Mars Посмотреть сообщение
Конфигурация исполняемой программы
Так понятно, жеж, что требуется инкапсуляция.
Максимальная гип кость.

Если это 'C', то инкапсуляцию обеспечивает function Config(),
если 'C++', то класс Config

По требованию выдаёт либо статическую переменную, либо динамическую.

Цитата Сообщение от Alex_Solo_Mars Посмотреть сообщение
Откуда я могу её прочитать?
Из файла - скукота, даже если он и JSON,
веселее всего из sqlite. нмв так одни плюсы у такого выбора.

спросил у бесплатного инопланетного разума:
C++: implement sqlite-based configuration file class for storing static and dynamic data. Provide callback interface to catch database events i.e insert, update, delete
тот в ответ нарисовал строк 300 с примерами. пока не проверял. но проверю


По сути получился Windows Registry + Registry monitor,
только намного лучше.
0
2 / 2 / 0
Регистрация: 29.05.2024
Сообщений: 62
15.05.2025, 22:34  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Ну вот. Есть два основных случая
Спасибо, вы дали очень хороший ответ. С другой стороны, вы просто другими словами пересказали преамбулу моего вопроса, т.к. я именно так и делаю.
Ваш пункт 1, это скорее про магические числа, тут вопрос у меня нету.
Давайте уточню. Есть константа, которая иногда меняется перед запуском программы, а иногда нет. Вот у меня есть двадцать имён файлов. Я запускаю программу с ними. В следующий раз девятое имя изменил, а остальные - нет. А в следующий раз наоборот.
Судя по вашему ответу, это пункт 2. "Вам нужно дать пользователю изменять её до момента запуска приложения.
Внешний файл." Это я понимаю, к тому и склоняюсь. Но потом смотрю код у разных людей и вижу что они предпочитают эти штуки засовывать в хедэры. Я задаю вопрос на киберфорум.ру про это. На первых двух страницах мне советуют эту инфу хранить в хедэрах. На третьей странице советуют хранить во внешнем файле.

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

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

Добавлено через 2 минуты
Цитата Сообщение от volodin661 Посмотреть сообщение
если 'C++', то класс Config
Это встроенный класс или самому писать?

Добавлено через 1 минуту
Цитата Сообщение от SmallEvil Посмотреть сообщение
Запихать константы в неймспейс ничуть не лучше чем в глобальном пространстве.
Почему не лучше. Я так конфликтов имён избегаю. Но и группирую как-то свои параметры по темам.
0
 Аватар для volodin661
7092 / 2323 / 352
Регистрация: 10.12.2013
Сообщений: 8,005
15.05.2025, 22:41
Цитата Сообщение от Alex_Solo_Mars Посмотреть сообщение
Это встроенный класс или самому писать?
Самому. Но с нуля не пишешь, пусть инопланетный разум пишет, а ты только правишь.
0
2 / 2 / 0
Регистрация: 29.05.2024
Сообщений: 62
15.05.2025, 22:45  [ТС]
Цитата Сообщение от volodin661 Посмотреть сообщение
Самому.
Я так и делаю. Пишу структуру Config и заполняю её из какого файла типа config.ini
И это только один из способов, которые я использую. Поэтому и задаюсь вопросом, а как всё-таки рациональнее.
0
15.05.2025, 22:57
 Комментарий модератора 
Verevkin, volodin661, не хотите помочь с "глупыми вопросами" - пройдите мимо темы.

Прекращаем всеобщий оффтоп и прочие непотребства.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
15.05.2025, 23:01
Цитата Сообщение от Alex_Solo_Mars Посмотреть сообщение
Возможно тут есть элемент вкуса и по большому счёт фиолетово когда я прочитаю с диска эту информация, во время компиляции или в рантайме.
В этом есть огромная разница.

Если вам не нужно знать эти данные во время компиляции, то они автоматически переходят в категорию данных "этапа выполнения".

Цитата Сообщение от Alex_Solo_Mars Посмотреть сообщение
Это встроенный класс или самому писать?
Есть готовые решения для подобных задач.
Например : Библиотека libconfig
Но часто каждый сам пилит для себя.

Цитата Сообщение от Alex_Solo_Mars Посмотреть сообщение
Почему не лучше. Я так конфликтов имён избегаю. Но и группирую как-то свои параметры по темам.
Вы их не избегаете, а уменьшаете количество имен.
Это полумера.

Цитата Сообщение от Alex_Solo_Mars Посмотреть сообщение
Ваш пункт 1, это скорее про магические числа, тут вопрос у меня нету.
Не совсем.

Да, искать потом эти константы, если вам приходится их менять, дело не очень.
Но если они там железно будут такими, то это уже и не "маг. числа".

Ну блин. Включайте фантазию. Раз вы хотите что бы эти данные были в одном месте.
C++
1
2
3
struct MyFileInstrument{
   static constexpr std::string filename = GlobalEnviroment::get<std::string>("InputFilename100500");
};
Вам всё равно придется где то эти маг. константы прописать.
Но лучше их прописать структурно, сгруппировано.

Вообще, все по ситуации.
Самая главная ошибка вашего вопроса, в фразе "что лучше".

Только время покажет насколько хорош ваш выбор в каждом конкретном случае.

А на счет обуч. материалов. Так ни в книга ни на форуме вы этого не увидите.
Самое программирование начинается на практических задачах.
Главное выучить базовые инструменты ЯП и практиковаться, практиковаться и практиковаться.

Любая задача решается введением нового слоя абстракций.
Важно потом выбраться из этих слоев
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,217
15.05.2025, 23:04
Цитата Сообщение от SmallEvil Посмотреть сообщение
файл ************.txt , а где находится строка "C:\my_project\input\**************. tx t". Откуда я могу её прочитать?
Ни где она не находиться. Вычисляеться автоматически. (От адреса экзешника). Создаються папки. Тоже автоматически.

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

Добавлено через 1 минуту
Цитата Сообщение от gogolik Посмотреть сообщение
всеобщий оффтоп
Так вопрос не очень коректный...
0
15.05.2025, 23:05

Не по теме:

Цитата Сообщение от Наталья8 Посмотреть сообщение
Так вопрос не очень коректный...
Это повод писать матом, ругаться на ТСа и устраивать чёрти-что из обсуждения? Нет.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.05.2025, 23:05

bat не является внутренней или внешней командой, исполняемой программой или пакетным файлом
Делаю программу, в которой мне нужно запустить bat-ник. Раньше всё отлично запускалось, а теперь не...

параллельная конфигурация
Добрый день. В VS C++ 2008 создаю программку, которая должна бы работать на компах, где не...

Конфигурация компьютера
Практически требуется заново реализовать утилиту от Windows под названием systeminfo хотелось бы...

Конфигурация железа
Надо написать программу, чтобы она показывала какое железо стоит на компе. Тоесть: какая модель...

Параллельная конфигурация неправильна
Здравствуйте! Написал программу, которая работает на моем компьютере, но не работает на другом....


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru