2015-04-06 2 views
0

Цель состоит в том, что при запуске программы определенная функция считывает файл конфигурации и устанавливает значение #define s. В других частях этого проекта эти директивы препроцессора будут определять, какой код выполнить, а что нет.Как и где определять предпроцессорные директивы, чтобы они были доступны везде, где мы хотим в проекте?

Пример:
Файл X содержит:
#define WHAT 0

Файл Y содержит:
#if (WHAT)
// Do this

Как и где же эти типы #define с организованы таким образом, чтобы они доступны, где они должны быть, не создавая беспорядка?

+5

#define предназначены для компиляции, а не для выполнения. –

+3

... так что вместо этого вам нужны переменные и 'if()' – deviantfan

ответ

1

Цель состоит в том, что при запуске программы функция будет читать файл конфигурации и устанавливать некоторые #defines. В других статьях этого проекта эти директивы препроцессора определяют , какой код выполнить, а что нет.

Как было сказано в другом ответе, это невозможно, так как препроцессорные директивы, такие как #define, потребляются предварительными процессорами компиляторов. То, что на самом деле представляют исполняемые двоичные файлы, это скомпилированный измененный источник, который остается тем же, независимо от того, когда вы запускаете другой файл, который вы открываете. Более того, нет такой концепции, как загрузка файла конфигурации и изменение времени выполнения, поскольку C++ - это скомпилированный язык, а не интерпретируемый.

Что на самом деле это возможно, чтобы

  • загрузить конфигурационный файл (желательно в формате стенд)
  • PARSE его с общедоступными библиотеками для стандартного формата или написать свой собственный парсер.
  • Используйте объекты STL, такие как карта, чтобы создать сопоставление между ключом конфигурации и значением
  • Поместите STL в какое-то пространство имен, чтобы не загрязнять глобальное пространство имен и не превращать его в extern. Убедитесь, что декларация extern присутствует в файле заголовка, а переменная определена в файле .cpp, чтобы доступ к переменной мог быть получен из единицы перевода, отличной от той, где она была определена.
  • Используйте распределенную конфигурацию в любом месте вашей программы.
+0

Благодарю вас. Не могли бы вы объяснить это примером: «Поместите STL в какое-то пространство имен, чтобы не загрязнять глобальное пространство имен и не ставить его в качестве внешнего extern». –

+0

@TheIndependentAquarius: размещение переменной в пространстве имен сводит к минимуму кошмар определения глобальных переменных.Создание переменной extern (извините, что static было опечаткой) обеспечит доступ к переменной из всех ваших программ cpp. – Abhijit

3

Директивы препроцессора разрешаются при компиляции программы, а не при ее запуске, поэтому то, что вы просите, не может быть выполнено.

Для выполнения этой работы вам понадобится механизм выполнения, но это не гарантирует исключение кода из скомпилированного двоичного файла.

Смежные вопросы