#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");
Jaka jest w tym rola #ifdef
i #ifndef
i jaki jest wynik?
#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");
Jaka jest w tym rola #ifdef
i #ifndef
i jaki jest wynik?
Odpowiedzi:
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
ifdef
ifndef
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ż one
jest zdefiniowane, więc ifdef
jest prawdziwe i ifndef
jest 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 ifdef
znaku nie zostanie usunięty, ponieważ one
jest zdefiniowany. Tekst po znaku ifndef
zostanie usunięty z tego samego powodu. W endif
pewnym 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
Ktoś powinien wspomnieć, że w pytaniu jest mała pułapka. #ifdef
sprawdzi tylko, czy następujący symbol został zdefiniowany za pomocą #define
lub 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, #if
to 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 defined
pozwala uzyskać pożądane zachowanie.
#if defined(one)
jest zatem równoważne z #ifdef
Zaletą tej #if
konstrukcji jest umożliwienie lepszej obsługi ścieżek kodu, spróbuj zrobić coś takiego ze starym #ifdef
/ #ifndef
pair.
#if defined(ORA_PROC) || defined(__GNUC) && __GNUC_VERSION > 300
„#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.
Kod wygląda dziwnie, ponieważ printf nie znajduje się w żadnych blokach funkcyjnych.