2009-08-21 2 views
67

In C++, è questa:Booleano in ifdef: è "#ifdef A && B" uguale a "#if definito (A) e definito (B)"?

#ifdef A && B 

lo stesso:

#if defined(A) && defined(B) 

?

Stavo pensando che non lo era, ma non sono stato in grado di trovare una differenza con il mio compilatore (VS2005).

+0

possibile duplicato di: http://stackoverflow.com/questions/965700/c-preprocessor-testing-definedness-of-multiple-macros vedo che sono C e C++, ma i preprocessori sono fondamentalmente gli stessi: http://stackoverflow.com/questions/5085533/is-ac-preprocess-identical-to-ac-preprocessore –

+0

Qualcuno citerà e interpreterà lo standard per decidere se è legale o no (non dovrebbe funzionare con certezza, ma dovrebbe essere compilato)? Non sono in grado di leggere dopo 15 minuti la lettura di "16 Preprocessing directives". –

risposta

72

Non sono la stessa cosa. Il primo non funziona (ho provato in gcc 4.4.1). Messaggio di errore era:

test.cc:1:15: avvertimento: gettoni extra alla fine del direttiva #ifdef

Se si desidera controllare se le cose più sono definiti, usa il secondo .

+0

Grazie per il controllo. Sto usando il compilatore di Microsoft e sembra accettarlo, ma non mi sembra giusto. – criddell

+1

Non è possibile provare le cose usando un singolo compilatore. Fare riferimento allo standard, che afferma che questo non è valido. –

+0

@LightnessRacesinOrbit Tuttavia, alcuni compilatori estendono lo standard. Dire "funziona in un determinato compilatore" non è un tentativo di dimostrare che è valido; si nota che un determinato compilatore estende lo standard in un certo modo. –

41

Conditional Compilation

È possibile utilizzare l'operatore definito nella direttiva #if usare espressioni che restituiscono 0 o 1 in una linea di preprocessore. Ciò consente di risparmiare da utilizzando direttive di pre-elaborazione nidificate. Le parentesi intorno all'identificatore sono facoltative. Per esempio:

#if defined (MAX) && ! defined (MIN) 

Senza utilizzare l'operatore definito, si dovrà includere i seguenti due direttive per eseguire l'esempio precedente:

#ifdef max 
#ifndef min 
+1

Mentre quello che dici è corretto, questo non risponde affatto alla domanda, ha chiesto se i due sono uguali ... non lo sono. –

+1

Penso che "non sono la stessa cosa", puoi vedere che spiega come creare un equivalente di #if definito (COND_A) && defined (COND_B) che è diverso da #ifdef COND_A && COND_B –

+0

In entrambi i casi, questo è una nota utile. –

-9

penso che forse OP voglio chiedere a proposito del documento "#if COND_A & & COND_B", non "#ifdef COND_A & & COND_B" ...

Sono anche diversi. "#if COND_A & & COND_B" può giudicare espresso logica, proprio come questo:

#if 5+1==6 && 1+1==2 
.... 
#endif 

anche, una variabile nel codice può anche essere utilizzato in questa macro statment:

int a = 1; 
#if a==1 
... 
#endif 
+3

No, non può ... –

+3

Questo è molto, molto sbagliato. Ogni riga che inizia con '#' in C++ (ignorando gli spazi bianchi iniziali) è una direttiva _precedente al programma_. Viene eseguito sul codice prima di compilarlo, assemblarlo o collegarlo - in altre parole, prima che il compilatore abbia la minima idea di quale sia il valore di ogni variabile, o anche che le variabili siano una cosa. Non ha assolutamente senso dire che sono in grado di dire in qualche modo il valore di uno sulla linea in cui si trovano; dato che ciò richiederebbe l'esecuzione del codice e il codice non è stato ancora compilato, è in realtà impossibile. Penso che forse intendevi parlare della dichiarazione "se". –

2

i seguenti risultati sono gli stessi:

1.

#define A 
#define B 
#if(defined A && defined B) 
printf("define test"); 
#endif 
#ifdef A 
#ifdef B 
printf("define test"); 
#endif 
#endif 
+2

Modifica la tua risposta –

+1

Puoi per favore aggiungere un commento per descrivere come questo risponde alla domanda, non è chiaro dalla tua risposta. –

-2

A partire da VS2015 nessuno dei precedenti funziona.La direttiva corretta è:

#if (MAX && !MIN) 

vedere più here

+1

Hai collegato alla documentazione C#, non a C++. –