2014-10-13 4 views
1

Там было несколько случаев, когда я видел препроцессора код вроде следующего:C++ #ifndef ЗНАК #define ЗНАК

#ifndef TOKEN 
#define TOKEN 
#endif 

Мне кажется, что в этой ситуации (я знаю, что это используйте, когда обернуты предметы, отличные от самого себя (включая включение охранников для тех, кто все еще отвечает)), избыточно проверять, был ли ТОКЕН уже определен до его определения. Если бы я просто #define его, без проверок результат будет таким же.

Есть ли общая причина для этого? Время компиляции? Сохранение блока для будущих дополнений?

Спасибо.

ответ

4

Потому что вы можете получить предупреждения о переопределении макросов в противном случае. Например, у нас есть сторонние dll, у которых есть заголовки с такими вещами, как следующее.

#define PI 3.14 

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

1) Использование их макро, и охранник против переопределения

#ifndef PI 
#define PI 3.14 
#endif 

2) Удалить их определение, а затем определить свою собственную

#ifdef PI 
#undef PI 
#endif 
#define PI 3.14 
+0

Это имеет смысл, спасибо. У меня не было никаких ошибок, поскольку я не думал добавлять значение в #define. Мой ум ослаблен.:) – Razioark

2

Одна классной вещь вы можете сделать с макросами определяют их в командной строке, для gcc я часто использую

gcc source.c -DMY_PI=6.5 

а затем в мой код

#ifndef MY_PI 
#define MY_PI 3.1415 
#endif 

Это позволяет мне скомпилировать один и тот же код с различными определениями MY_PI, но и позволяет значение по умолчанию.

+2

И, конечно, мне очень нравится устанавливать PI на 6.5, ...? – ilent2

+0

Я никогда не был уверен, что такое GCC, но это хорошо, я буду помнить об этом. Это то, о чем говорит редактор UE4, при создании движка/игры для определенных целей/настроек, верно? – Razioark

0

Включает охрану.

В языках программирования C и C++ защита #include, иногда называемая защитой макросов, является конкретной конструкцией, используемой to avoid the problem of double inclusion when dealing with the include directive. Добавление защитных элементов #include в заголовочный файл является одним из способов сделать этот файл идемпотент.

Пожалуйста, проверьте подробности ниже:

http://en.wikipedia.org/wiki/Include_guard

C++ - header guards

0

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

#pragma once 

в верхней части файла.

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