В чем разница между этими директивами компилятора?

StackOverflow https://stackoverflow.com/questions/1518168

Вопрос

В чем разница между этими директивами?

#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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top