Было несколько случаев, когда я видел код препроцессора, подобный следующему:
#ifndef TOKEN
#define TOKEN
#endif
Мне кажется, что в этой ситуации (я знаю, что он используется, когда оборачивается вокруг предметов, отличных от него самого (включая охранников для тех, кто все еще отвечает)), избыточно проверять, определен ли уже TOKEN перед определением Это. Если бы я просто # определил это, без проверок, результат был бы таким же.
Есть ли общая причина для этого? Время компиляции? Зарезервировать блок для будущих дополнений?
Благодарю.
Потому что иначе вы можете получить предупреждения о переопределении макросов. Например, у нас есть сторонние dll, которые имеют заголовки со следующими вещами.
#define PI 3.14
Так как они определены в сторонних заголовках, мы не можем их контролировать и не можем удалить или переименовать их. Если мы также попытаемся определить Pi самостоятельно, мы получим предупреждение о переопределении макроса. Итак, у вас есть два варианта,
1) Используйте свой макрос и защитите себя от переопределения
#ifndef PI
#define PI 3.14
#endif
2) Удалите их определение, затем определите свое собственное
#ifdef PI
#undef PI
#endif
#define PI 3.14
Одна классная вещь, которую вы можете сделать с макросами, это определить их в командной строке, для gcc я часто использую
gcc source.c -DMY_PI=6.5
а потом в моем коде
#ifndef MY_PI
#define MY_PI 3.1415
#endif
Это позволяет мне компилировать один и тот же код со многими различными определениями MY_PI, но также позволяет использовать значение по умолчанию.
Это включает охрану.
В языках программирования C и C ++ особой конструкцией является защита #include, иногда называемая макросохранением. to avoid the problem of double inclusion when dealing with the include directive
, Добавление защиты #include в заголовочный файл — один из способов сделать этот файл идемпотентным.
Пожалуйста, проверьте ниже для деталей:
Точный пример часто используется для защиты от множественного включения (включая защиту). В больших базах кода у вас может быть файл h, который включен в несколько мест, и эта конструкция используется, чтобы избежать ошибки переопределения. В современных компиляторах его можно заменить на
#pragma once
в верхней части файла.