Udostępnij za pośrednictwem


# define dyrektywy (C/C++)

#define Tworzy makro, który jest skojarzenie identyfikatora lub identyfikatora sparametryzowanej z token ciągu.Po zdefiniowaniu makro kompilator może zastąpić token ciągu dla każdego wystąpienia identyfikatora w pliku źródłowym.

Składnia

#defineIdentyfikatortoken ciąguopt

#defineidentifier(identifieropt,...,identifieropt)token-stringopt

Uwagi

#define Dyrektywy powoduje, że kompilator podstawić token ciągu dla każdego wystąpienia identyfikatora w pliku źródłowym.Identyfikatora zastępuje się tylko wtedy, gdy stanowi ona tokenu.Oznacza to, że identyfikatora nie jest zastępowany, jeśli wydaje się w komentarzu, w ciągu lub jako część identyfikatora dłużej.Aby uzyskać więcej informacji, zobacz Tokeny C++.

Token ciągu argument składa się z serii tokeny, takich jak słowa kluczowe, stałe lub kompletne sprawozdania.Jeden lub więcej znaków spacji muszą być rozdzielone token ciągu z identyfikatora.Ten odstęp nie jest uważany za część tekstu podstawionych ani jest dowolny odstęp występujący ostatniego tokena tekst.

A #define bez token ciągu usuwa wystąpienia identyfikatora z pliku źródłowego.Identyfikatora pozostaje zdefiniowane i mogą być badane przy użyciu #if defined i #ifdef dyrektyw.

Drugi formularz składni definiuje makro jak funkcja z parametrami.Ten formularz akceptuje opcjonalna lista parametrów, które muszą znajdować się w nawiasach.Po makro jest zdefiniowana, każdego kolejnego wystąpienia identyfikatora( identyfikatoropt,..., identyfikatoraopt ) jest zastąpiona wersją z token ciągu argument, że ma rzeczywiste argumenty podstawione parametrów formalnych.

Nazwy parametrów formalnych pojawiają się w token ciągu do oznaczenia miejsca, gdzie są zastępowane wartościami rzeczywistymi.Nazwa każdego parametru mogą pojawiać się wielokrotnie w token ciągu, i nazwy mogą pojawiać się w dowolnej kolejności.Liczba argumentów w wywołaniu musi odpowiadać liczba parametrów w definicji makra.Liberalne wykorzystanie nawiasów gwarancji złożonych bieżących argumentów są prawidłowo interpretowane.

Parametry formalne na liście są oddzielone przecinkami.Każda nazwa na liście musi być unikatowa i listy muszą być ujęte w nawiasy.Spacji można oddzielić identyfikatora i nawias otwierający.Użyj linii konkatenacji — umieszczenie znaku odwrotnej kreski ukośnej (\) bezpośrednio przed znakiem nowego wiersza — długie dyrektyw dotyczących wielu wierszy źródłowych.Zakres nazw parametrów formalnych rozciąga się do nowego wiersza, który kończy się token ciągu.

Makra zdefiniowane w drugim formularzu składni kolejnych wystąpień tekstowe następuje lista argumentów wskazują wywołanie makra.Rzeczywiste argumenty, które następuje wystąpienie identyfikatora w pliku źródłowym są dopasowywane do odpowiednich parametrów formalnych w definicji makra.Każdego parametru formalne w token ciągu nie jest poprzedzony przez stringizing (#), charizing (#@), lub wklejanie token (##) operator, lub nie następuje ## operatora, zastępuje odpowiednie rzeczywiste argument.Makr w argumencie rzeczywiste są rozwinięte, zanim dyrektywa zastępuje parametrów formalnych.(Podmioty gospodarcze są opisane w Preprocesora Operatorzy.)

Poniższe przykłady makr z argumentami ilustrują drugą formę #define składni:

// Macro to define cursor lines 
#define CURSOR(top, bottom) (((top) << 8) | (bottom))

// Macro to get a random integer with a specified range 
#define getrandom(min, max) \
    ((rand()%(int)(((max) + 1)-(min)))+ (min))

Argumenty z efektów ubocznych niekiedy powodować makra, aby wygenerować nieoczekiwane wyniki.Danym parametrów formalnych może pojawić się więcej niż jeden raz w token ciągu.Jeśli w tym parametrów formalnych zastępuje wyrażenie z efektów ubocznych, wyrażenie, z jego efekty uboczne mogą być oceniane więcej niż jeden raz.(Zobacz przykłady w Token wklejanie operatora (#).)

#undef Dyrektywy powoduje, że identyfikator preprocesora definicji należy zapominać.Zobacz #undef dyrektywy Aby uzyskać więcej informacji.

Jeśli nazwa makra, definiowanego występuje w token ciągu (nawet w wyniku innego rozszerzenia makra), nie jest rozwinięte.

Drugi #define dla makra o tej samej nazwie generuje ostrzeżenie, o ile drugi sekwencja token jest taka sama, jak pierwszy.

Programu Microsoft

Microsoft C/C++ umożliwia zdefiniowanie makra, jeśli nowa definicja jest syntaktycznie identyczne z oryginalną definicję.Innymi słowy dwie definicje mogą mieć nazwy różnych parametrów.To zachowanie różni się od ANSI C, która wymaga leksykalnych identyczne dwie definicje.

Na przykład następujące dwa makra są identyczne, z wyjątkiem nazwy parametru.ANSIC nie zezwala na takie przedefiniowanie, ale Microsoft C/C++ kompiluje bez błędu.

#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( a1 * a2 )

Z drugiej strony dwa następujące makra nie są identyczne i wygeneruje ostrzeżenie Microsoft C/C++.

#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( b1 * b2 )

KONIEC Microsoft szczególne

Ten przykład ilustruje #define dyrektywę:

#define WIDTH       80
#define LENGTH      ( WIDTH + 10 )

Pierwsza instrukcja Określa identyfikator WIDTH as integer stałej 80 i definiuje LENGTH z punktu widzenia WIDTH i całkowitą 10 stałych.Każde wystąpienie LENGTH otrzymuje brzmienie (WIDTH + 10).Z kolei, każde wystąpienie WIDTH + 10 zastępuje wyrażenie (80 + 10).Nawiasy wokół WIDTH + 10 są ważne, ponieważ kontrolują interpretacji w sprawozdaniu, takie jak następujące:

var = LENGTH * 20;

Po wstępne przetwarzanie etap oświadczenie staje się:

var = ( 80 + 10 ) * 20;

która jest wynikiem 1800.Bez nawiasów wynik jest:

var = 80 + 10 * 20;

która jest wynikiem 280.

Programu Microsoft

Definiowanie makr i stałych, z /D opcję kompilatora ma taki sam efekt jak za pomocą #define dyrektywy preprocesora, za pomocą na początku pliku.Maksymalnie 30 makra można zdefiniować za pomocą opcji /D.

KONIEC Microsoft szczególne

Zobacz też

Informacje

Dyrektywy preprocesora