#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?
#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?
Respostas:
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
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
"#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.
O código parece estranho porque printf não está em nenhum bloco de função.