Включить Guards и #ifndef #define заявления о предварительной обработке

Если я сделаю следующее:

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?

1

Решение

Вы под использованием сила #ifndef.

Ваш dConst.hpp Файл должен включать охранников. В противном случае это вызовет проблемы (именно те проблемы, которые вы видели), если он будет включен из более чем одного файла в единицу перевода.

РЕДАКТИРОВАТЬ: Я также разместил бы ваши охранники в genPower.hpp в верхней части файла, перед вашими включенными утверждениями.

1

Другие решения

Определенно да.

Смысл включения защитников заключается в том, чтобы гарантировать, что ваш код не будет включен дважды — если у вас есть код в заголовочных файлах, которых нет внутри включения защиты, если вы включаете этот заголовок дважды, вы определяете все, что находится за пределами защиты дважды ,

Чтобы лучше понять, что происходит, ваш сгенерированный код выглядит примерно так:

#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.

1

По вопросам рекламы [email protected]