2013-08-06 10 views
6

Cosa significa la seguente dichiarazione:#define IDENTIFIER senza un gettone

#define FAHAD 

ho familiarità con le affermazioni del tipo:

#define FAHAD 1 

Ma che cosa significa l'affermazione #define senza un gettone significa? È simile a una definizione costante?

+1

vedere anche questo [link] (http://stackoverflow.com/questions/7594808/what-use-cases-necessitate-define- senza-a-token-string) per le risposte. –

risposta

5

significa che FAHAD è definito, in seguito sarà possibile verificare se è definito o meno con:

#ifdef FAHAD 
    //do something 
#else 
    //something else 
#endif 

Oppure:

#ifndef FAHAD //if not defined 
//do something 
#endif 

Un esempio dell'uso di vita reale è quello di verificare se una funzione o un'intestazione è disponibile per la piattaforma, in genere un sistema di generazione definirà le macro per indicare che alcune funzioni o intestazioni esistono prima della compilazione effettiva, ad esempio verifica se è disponibile signal.h:

#ifdef HAVE_SIGNAL_H 
# include <signal.h> 
#endif/*HAVE_SIGNAL_H*/ 

Questo controlla se qualche funzione è disponibile

#ifdef HAVE_SOME_FUNCTION 
//use this function 
#else 
//else use another one 
#endif 
7

Definire una costante senza un valore agisce come una bandiera per il preprocessore, e può essere utilizzato in questo modo:

#define MY_FLAG 
#ifdef MY_FLAG 
/* If we defined MY_FLAG, we want this to be compiled */ 
#else 
/* We did not define MY_FLAG, we want this to be compiled instead */ 
#endif 
4

Qualunque #define risultati nella sostituzione dell'identificatore originale con i token sostitutivi. Se non ci sono token di sostituzione, la sostituzione è vuota:

#define DEF_A "some stuff" 
#define DEF_B 42 
#define DEF_C 
printf("%s is %d\n", DEF_A, DEF_B DEF_C); 

espande a:

printf("%s is %d\n", "some stuff", 42); 

metto uno spazio tra 42 e ) per indicare il "nulla" che DEF_C espansa-to, ma almeno in termini di linguaggio, l'output del preprocessore è semplicemente un flusso di token. (I compilatori effettivi in ​​genere consentono di vedere l'output del preprocessore.Qualunque ci sia spazio bianco qui dipende dal preprocessore effettivo. Per GNU cpp, ce n'è uno.)

Come nelle altre risposte finora, è possibile utilizzare #ifdef per verificare se un identificatore è stato #define d. Puoi anche scrivere:

#if defined(DEF_C) 

per esempio. Questi test sono positivi (vale a dire, l'identificatore è definito da) anche se l'espansione è vuota.

0
#define FAHAD 

questo si comporterà come un flag di compilazione, in base al quale è possibile eseguire codice. questo istruire il compilatore per compilare il codice presente sotto questa opzione del compilatore

#ifdef FAHAD 
printf(); 
#else 
/* NA */ 
#endif