Директивы #ifdef и #ifndef выполняют одну и ту же задачу как #if при использовании директива defined (Идентификатор).
#ifdef identifier
#ifndef identifier
// equivalent to
#if defined identifier
#if !defined identifier
Можно использовать #ifdef и #ifndef в любом месте, где #if может использоваться. Идентификатор #ifdef эквивалентен #if:
- Идентификатор определен - 1.
- Идентификатор не указан или не определен с #undef директивой - 0.
Эти правила проверяют только наличия или отсутствия идентификаторов, указанных с #define не для идентификаторов, объявленных в исходном коде C или C++.
Эти рекомендации предназначены только для совместимости с предыдущими версиями языка.
#ifndef директива проверяет наличие условий для проверенного противоположного к #ifdef. Если идентификатор не задан или ее определение было удалено с #undef, условие имеет значение true (), т.е. не равно нулю. В противном случае условие имеет значение false (0).
Только для систем Microsoft
Идентификатор может передаваться из командной строки с помощью параметра /D. До 30 макросов может быть определено параметром /D. Это полезно для проверки существования определения, потому что определение может передаваться из командной строки:
// ifdef_ifndef.CPP
// compile with: /Dtest /c
#ifndef test
#define final
#endif