Если я сделаю следующее:
dConst.hpp
const int POWER_LEVEL = 9001;
genPower.hpp
#include "dConst.hpp"
#ifndef GENPOWER_HPP
#define GENPOWER_HPP
const int GENERATOR[1] = { POWER_LEVEL };
#endif
Я заканчиваю тем, что получаю ошибки компоновщика для любого кода, который использует константу массива генератора.
Однако, если я переключу #include "dConst.hpp"
с блоком кода:
#ifndef GENPOWER_HPP
#define GENPOWER_HPP
Оно работает…
Я неправильно использую силу #ifndef
?
Вы под использованием сила #ifndef.
Ваш dConst.hpp
Файл должен включать охранников. В противном случае это вызовет проблемы (именно те проблемы, которые вы видели), если он будет включен из более чем одного файла в единицу перевода.
РЕДАКТИРОВАТЬ: Я также разместил бы ваши охранники в genPower.hpp
в верхней части файла, перед вашими включенными утверждениями.
Определенно да.
Смысл включения защитников заключается в том, чтобы гарантировать, что ваш код не будет включен дважды — если у вас есть код в заголовочных файлах, которых нет внутри включения защиты, если вы включаете этот заголовок дважды, вы определяете все, что находится за пределами защиты дважды ,
Чтобы лучше понять, что происходит, ваш сгенерированный код выглядит примерно так:
#Include в основном просто вставляет содержимое включенного файла непосредственно в другой файл на месте, что означает, что ваш genPower.hpp выглядит следующим образом (без правильно включенных защитных элементов, как вы изначально задали в своем вопросе):
const int POWER_LEVEL = 9001;
#ifndef GENPOWER_HPP
#define GENPOWER_HPP
const int GENERATOR[1] = { POWER_LEVEL };
#endif
Поэтому каждый раз, когда вы включаете этот файл, до того, как #ifndef будет достигнут, определяется POWER_LEVEL. Если вы переключаете строки POWER_LEVEL с помощью определения # ifndef / #, каждый раз, когда вы включаете этот файл, он сначала проверяет, был ли он уже включен (с #ifndef — если он уже был включен, #define должен был выполнить свою работу ) и ТОЛЬКО ТОГДА (после того, как выяснится, что это в первый раз) он определит POWER_LEVEL.
Кроме того, вы почти наверняка захотите включить защиту в ваш dConst.hpp — ВСЕ заголовки должны иметь защиту, и они должны защищать ВСЕ в файле заголовка. Это твоя ошибка с #ifndef.