2013-08-06 11 views
6

Co oznaczają następujące oświadczenie:#define IDENTIFIER bez token

#define FAHAD 

jestem zaznajomiony z wypowiedzi, takich jak:

#define FAHAD 1 

ale co oświadczenie #define bez tokena oznacza? Czy to jest podobne do stałej definicji?

+1

patrz także o [związek] (http://stackoverflow.com/questions/7594808/what-use-cases-necessitate-define- bez-a-tokenu) dla odpowiedzi. –

Odpowiedz

5

to znaczy, że FAHAD jest zdefiniowana, można później sprawdzić, czy jest zdefiniowana lub nie z:

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

Lub:

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

przykładem wykorzystanie prawdziwe życie jest sprawdzenie, czy funkcja lub nagłówek jest dostępny dla twojej platformy, zazwyczaj system kompilacji definiuje makra, aby wskazać, że niektóre funkcje lub nagłówki istnieją przed rozpoczęciem kompilacji, na przykład sprawdza, czy dostępna jest signal.h:

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

ten sprawdza, czy niektóre funkcja jest dostępna

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

Definiowanie stała bez wartości czynów jako flaga do preprocesora, i mogą być stosowane w taki sposób:

#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

Wszelkie #define powoduje zastąpienie oryginalnego identyfikatora zastępującymi tokenami. Jeśli nie ma żadnych żetonów zamienne, wymiana jest pusty:

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

rozszerza się:

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

umieścić spację między 42 i ) wskazanie „nic”, które DEF_C rozszerzonym, ale przynajmniej pod względem języka, wyjście preprocesora jest jedynie strumieniem tokenów. (Rzeczywiste kompilatory generalnie pozwalają zobaczyć wyjście preprocesora.Każda będzie tu biała-przestrzeń zależy od rzeczywistego preprocesora.Jeśli GNU cpp, jest jeden.)

Podobnie jak w innych odpowiedzi do tej pory, można użyć #ifdef, aby sprawdzić, czy identyfikator był #define d. Możesz również napisać:

#if defined(DEF_C) 

na przykład. Testy te są pozytywne (tj. Identyfikator jest zdefiniowany jako), nawet jeśli rozszerzenie jest puste.

0
#define FAHAD 

to będzie działać jak flaga kompilatora, pod którą można wykonać kod. będzie to poinstruować kompilator kompilacji kodu obecny w tej opcji kompilatora

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