Когда нам нужен #ifdef перед #undef?
Во многих файлах C и C++ я видел такие макросы:
#ifdef X
#undef X // no statements in between
#endif
Я чувствую, что достаточно написать:
#undef X
Если макрос X
не был определен, то #undef
не должно иметь никакого эффекта.
Это нормально поставить автономно #undef
, если я хочу только неопределить макрос? В любом случае это делает практику кодирования плохой?
3 ответа
См. ISO C99 6.10.3.5, параграф 2.
Директива предварительной обработки вида
# undef identifier new-line
заставляет указанный идентификатор больше не быть определенным как имя макроса. Он игнорируется, если указанный идентификатор в настоящее время не определен как имя макроса.
Даже Visual C++ 6 (который был известен плохим соответствием стандартам) позволяет это:
Вы также можете применить
#undef
директива для идентификатора, который не имеет предыдущего определения. Это гарантирует, что идентификатор не определен. Замена макроса не выполняется в течение#undef
заявления.
Я уверен, что это артефакт истории. Как уже упоминалось в ответе jdigital, второе издание K&R гласит:
Не ошибочно применять #undef к неизвестному идентификатору.
Однако этого предложения нет в издании 1978 года. Я почти уверен, что стандартные компиляторы часто выдают ошибку, если вы попытаетесь #undef
неопределенный макрос.
Также ANSI C Обоснование говорит:
Явно разрешено #undef макрос, который не имеет текущего определения.
Я полагаю, что если бы это была уже универсальная практика, не было бы необходимости называть это обоснованием.
Все это говорит о том, что в современном коде это не нужно, но на самом деле это тоже не больно.
Керниган и Ричи (2-е издание) согласны с вами.
РЕДАКТИРОВАТЬ: цитата из источника (раздел A12.3):
Контрольная линия формы
# undef
идентификаторвызывает определение препроцессора идентификатора, чтобы быть забытым. Если не ошибочно применять
#undef
неизвестному идентификатору.