Qual é a diferença entre essas diretivas do compilador?
-
19-09-2019 - |
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.
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
.