Rola #ifdef i #ifndef


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

Jaka jest w tym rola #ifdefi #ifndefi jaki jest wynik?

Odpowiedzi:


131

Tekst znajdujący się w parzeifdef/endif lub zostanie pozostawiony lub usunięty przez preprocesor w zależności od stanu. oznacza „jeśli następujące jest zdefiniowane” podczas gdy oznacza „jeśli następujące elementy nie są zdefiniowane”.ifndef/endif ifdefifndef

Więc:

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

jest równa:

printf("one is defined ");

ponieważ onejest zdefiniowane, więc ifdefjest prawdziwe i ifndefjest fałszywe. To nie ma znaczenia, co jest zdefiniowana jako . Podobny (moim zdaniem lepszy) fragment kodu do tego byłby:

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

ponieważ to jaśniej określa zamiar w tej konkretnej sytuacji.

W Twoim przypadku tekst po ifdefznaku nie zostanie usunięty, ponieważ onejest zdefiniowany. Tekst po znaku ifndef zostanie usunięty z tego samego powodu. W endifpewnym momencie będą musiały być dwie linie zamykające , a pierwsza spowoduje ponowne włączenie wierszy w następujący sposób:

     #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

68

Ktoś powinien wspomnieć, że w pytaniu jest mała pułapka. #ifdefsprawdzi tylko, czy następujący symbol został zdefiniowany za pomocą #definelub z wiersza poleceń, ale jego wartość (w rzeczywistości jego podstawienie) nie ma znaczenia. Możesz nawet pisać

#define one

prekompilatory to akceptują. Ale jeśli używasz, #ifto inna rzecz.

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

da one does not evaluate to truth. Słowo kluczowe definedpozwala uzyskać pożądane zachowanie.

#if defined(one) 

jest zatem równoważne z #ifdef

Zaletą tej #ifkonstrukcji jest umożliwienie lepszej obsługi ścieżek kodu, spróbuj zrobić coś takiego ze starym #ifdef/ #ifndefpair.

#if defined(ORA_PROC) || defined(__GNUC) && __GNUC_VERSION > 300

0

„#if one” oznacza, że ​​jeśli napisano „#define one”, to „#if one” jest wykonywane, w przeciwnym razie wykonywane jest „#ifndef one”.

To jest po prostu odpowiednik dyrektywy C Pre-Processor (CPP) instrukcji if, then, else w języku C.

tj. jeśli {#define one} to printf ("jeden daje prawdę"); else printf ("jeden nie jest zdefiniowany"); więc jeśli nie ma #define jednej instrukcji, to zostanie wykonana inna gałąź instrukcji.


4
Nie jestem pewien, co to dodaje, że inne odpowiedzi jeszcze nie obejmują, a twój przykład nie jest C lub C ++.
SirGuy

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.