В чем разница между этими директивами компилятора? - PullRequest
3 голосов
/ 05 октября 2009

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

#ifdef FOO

#if defined FOO

#if defined(FOO)

Я использую компилятор CCS, но мне интересны и другие C компиляторы.

Ответы [ 4 ]

9 голосов
/ 05 октября 2009

Из того, что я видел, основное использование для #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.

3 голосов
/ 05 октября 2009

Все 3 формы в точности соответствуют и действительны в соответствии со стандартом 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 необязательно; Я предпочитаю использовать их, чтобы добавить ясности.

1 голос
/ 05 октября 2009

Первоначально было только #ifdef, но когда пришло #if, необходимо было иметь defined() для того, чтобы #if переопределял #ifdef.

1 голос
/ 05 октября 2009

# ifdef - это сокращение от #, если оно определено , и я думаю, вам не нужно использовать ни одну из скобок, поэтому в основном они одинаковы.

Исходя из Turbo C, я привык смотреть # ifdef , а не #, если определено

...