A função de #ifdef e #ifndef

99
#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");

Nesse caso, qual é a função de #ifdefe #ifndef, e qual é a saída?

alka pandey
fonte

Respostas:

131

O texto dentro de um parifdef/endif ou será deixado ou removido pelo pré-processador dependendo da condição. significa "se o seguinte for definido", enquanto significa "se o seguinte não for definido".ifndef/endif ifdefifndef

Assim:

#define one 0
#ifdef one
    printf("one is defined ");
#endif
#ifndef one
    printf("one is not defined ");
#endif

é equivalente a:

printf("one is defined ");

uma vez que oneé definido, o ifdefé verdadeiro e o ifndefé falso. Não importa o que é definido como . Um trecho de código semelhante (melhor na minha opinião) a isso seria:

#define one 0
#ifdef one
    printf("one is defined ");
#else
    printf("one is not defined ");
#endif

uma vez que especifica a intenção mais claramente nesta situação particular.

No seu caso específico, o texto após o ifdefnão é removido, pois oneestá definido. O texto após o ifndef é removido pelo mesmo motivo. Será necessário que haja duas endiflinhas de fechamento em algum ponto e a primeira fará com que as linhas comecem a ser incluídas novamente, da seguinte forma:

     #define one 0
+--- #ifdef one
|    printf("one is defined ");     // Everything in here is included.
| +- #ifndef one
| |  printf("one is not defined "); // Everything in here is excluded.
| |  :
| +- #endif
|    :                              // Everything in here is included again.
+--- #endif
paxdiablo
fonte
68

Alguém deve mencionar que na pergunta há uma pequena armadilha. #ifdefirá apenas verificar se o seguinte símbolo foi definido via #defineou pela linha de comando, mas seu valor (sua substituição na verdade) é irrelevante. Você poderia até escrever

#define one

os pré-compiladores aceitam isso. Mas se você usar #ifé outra coisa.

#define one 0
#if one
    printf("one evaluates to a truth ");
#endif
#if !one
    printf("one does not evaluate to truth ");
#endif

vai dar one does not evaluate to truth. A palavra-chave definedpermite obter o comportamento desejado.

#if defined(one) 

é, portanto, equivalente a #ifdef

A vantagem da #ifconstrução é permitir um melhor manuseio dos caminhos do código, tente fazer algo parecido com o #ifdef/ #ifndefpar antigo .

#if defined(ORA_PROC) || defined(__GNUC) && __GNUC_VERSION > 300
Patrick Schlüter
fonte
0

"#if one" significa que se "#define one" foi escrito, "#if one" é executado, caso contrário "#ifndef one" é executado.

Esta é apenas a diretiva do pré-processador C (CPP) equivalente às instruções de ramificação if, then, else na linguagem C.

ie if {#define one} then printf ("um avalia como uma verdade"); else printf ("um não está definido"); portanto, se não houver #define uma instrução, o outro ramo da instrução será executado.

Rodders
fonte
4
Não tenho certeza do que isso adiciona que as outras respostas ainda não cobrem, e seu exemplo não é C ou C ++.
SirGuy,
-2

O código parece estranho porque printf não está em nenhum bloco de função.

hwx
fonte
1
todo o bloco pode estar dentro da própria função. E bem-vindo ao stackoverflow. Leia stackoverflow.com/help/how-to-answer .
rajashekar