В чем разница между этими директивами компилятора?
-
19-09-2019 - |
Вопрос
В чем разница между этими директивами?
#ifdef FOO
#if defined FOO
#if defined(FOO)
Я использую компилятор CCS, но меня интересуют другие С компиляторы тоже.
Решение
Судя по тому, что я видел, основное применение #if defined
заключается в проверке наличия нескольких определений макросов в одной строке.В остальном, насколько мне известно, для условий определения одного макроса они идентичны.
#include <stdio.h>
int main()
{
#if defined(FOO) && defined(BAR)
printf("foobar!\n");
#else
printf("nothing.\n");
#endif
return 0;
}
$ tcc -DFOO -run a.c nothing. $ tcc -DBAR -run a.c nothing. $ tcc -DFOO -DBAR -run a.c foobar!
Кроме того, приведенная выше программа отлично компилируется с gcc -Wall -ansi a.c
так что это предполагает #if defined
правильно ANSI C.Более того, это резюме ANSI C от 1987 года списки #if defined
как новое поведение препроцессора в соответствии со стандартами ANSI — это должен быть стандартным для любого ANSI-совместимого компилятора, который вы будете использовать.
Если вы не использовали #if defined
, тебе придется сделать
#ifdef FOO
#ifdef BAR
printf("foobar!\n");
#endif /* BAR */
#endif /* FOO */
Также, руководство Redhat для препроцессора C говорит
#if defined MACRO
в точности эквивалентно#ifdef MACRO
.
Другие советы
Все три формы полностью эквивалентны и действительны в соответствии со стандартом C99.В целом #ifdef
предпочтительнее, потому что она короче двух других форм, но бывают ситуации, когда вы захотите использовать другие формы:
При проверке определений нескольких символов или более сложных выражений:
#if defined(ONE_THING) && define(ANOTHER_THING) && (3 < 4) ... #endif
Если у вас несколько предложений, их гораздо проще использовать.
#elif defined(...)
чем#else
,#ifdef
:#if defined(ONE_THING) ... #elif defined(ANOTHER_THING) ... #elif defined(THIRD_THING) ... #else ... #endif
Использование круглых скобок с defined
является необязательным;Я предпочитаю использовать их, чтобы добавить ясности.
#ifdef это сокращение от #если определено и я думаю, что вам не нужны круглые скобки ни в том, ни в другом, так что по сути они одинаковы.
Исходя из Turbo C, я привык смотреть на #ifdef скорее, чем #если определено
Первоначально существовал только #ifdef
, но когда #if
пришло, было необходимо иметь defined()
Для того чтобы #if
суперсет #ifdef
.