Pergunta

Qual é a diferença entre essas diretivas?

#ifdef FOO

#if defined FOO

#if defined(FOO)

Estou usando o compilador CCS, mas estou interessado em outros C compiladores também.

Foi útil?

Solução

Pelo que vi, o principal uso para #if defined é fazer uma verificação de várias definições de macro em uma linha. Caso contrário, para condicionais de definição de macro única, eles são idênticos, tanto quanto eu sei.

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

Além disso, o programa acima compila bem com gcc -Wall -ansi a.c Então isso sugere #if defined está correto Ansi C. Além disso, Este resumo do ANSI C de 1987 listas #if defined como um comportamento recém -definido para o pré -processador sob os padrões da ANSI - este deve Seja padrão em qualquer compilador compatível com ANSI que você usará.

Se você não estava usando #if defined, você teria que fazer

#ifdef FOO
#ifdef BAR
    printf("foobar!\n");
#endif /* BAR */
#endif /* FOO */

Também, o manual do redhat para o pré -processador C diz

#if defined MACRO é precisamente equivalente a #ifdef MACRO.

Outras dicas

Todos os 3 formulários são exatamente equivalentes e válidos, de acordo com o padrão C99. Geralmente #ifdef é preferido porque é mais curto que as outras duas formas, mas há situações em que você deseja usar as outras formas:

  • Se testar as definições de múltiplos símbolos ou expressões mais complexas:

    #if defined(ONE_THING) && define(ANOTHER_THING) && (3 < 4)
    ...
    #endif
    
  • Se você tem várias cláusulas, é muito mais fácil de usar #elif defined(...) do que #else, #ifdef:

    #if defined(ONE_THING)
    ...
    #elif defined(ANOTHER_THING)
    ...
    #elif defined(THIRD_THING)
    ...
    #else
    ...
    #endif
    

O uso de parênteses com defined é opcional; Prefiro usá -los para adicionar clareza.

#ifdef é curto para #If definido E acho que você não precisa de parênteses, então basicamente eles são iguais.

Vindo de Turbo C, estou acostumado a olhar #ifdef ao invés de #If definido

Originalmente havia apenas #ifdef, mas quando #if veio, era necessário ter defined() para #if para superset #ifdef.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top