Когда нам нужен #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 неизвестному идентификатору.

Другие вопросы по тегам