#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?
#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:
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
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
„#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.