#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");
Nesse caso, qual é a função de #ifdef
e #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 #ifdef
e #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
ifdef
ifndef
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 ifdef
não é removido, pois one
está definido. O texto após o ifndef
é removido pelo mesmo motivo. Será necessário que haja duas endif
linhas 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. #ifdef
irá apenas verificar se o seguinte símbolo foi definido via #define
ou 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 defined
permite obter o comportamento desejado.
#if defined(one)
é, portanto, equivalente a #ifdef
A vantagem da #if
construção é permitir um melhor manuseio dos caminhos do código, tente fazer algo parecido com o #ifdef
/ #ifndef
par 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.