# define 指示詞 (C/C++)

#define會建立巨集,也就是識別項或參數型的識別項與關聯語彙基元的字串。定義巨集之後,編譯器就可以使用替代的語彙基元的字串,針對每個原始程式檔中的識別項。

語法

#define識別項語彙基元字串opt

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

備註

#define指示詞會使編譯器以取代語彙基元字串針對每個識別項原始程式檔中。識別項只有當它可構成語彙基元時,才會被取代。也就是識別項並不會取代,如果它出現在 [註解,在字串中,或更長的識別項的一部分。如需詳細資訊,請參閱 C + + 的語彙基元

語彙基元字串引數是由一系列的語彙基元,如關鍵字、 常數或完整的陳述式所組成。一或多個空白字元必須分隔語彙基元字串 的 識別項。這個泛空白字元並不是組件的替代文字,也不是所有空白位置後面的文字的最後一個語彙基元。

A #define而不語彙基元字串的項目移除識別項從原始程式檔。識別項仍會保留所定義,並可使用#if defined和#ifdef指示詞。

第二種語法形式定義參數的函式類似的巨集。此表單會接受選擇性參數必須出現在括號中的清單。巨集的定義,後續的每一個項目後識別項( 識別項選擇、...、 識別項選擇 ) 的版本會取代 語彙基元字串實質引數取代型式參數的引數。

型式參數名稱會出現在語彙基元字串標記則會取代實際值,其中的位置。每個參數名稱可出現多次,在語彙基元字串,而且名稱可以按照任意順序出現。在呼叫的引數的數目必須符合在巨集定義中的參數數目。大量利用括號可以保證能正確解譯複雜的實質引數。

型式參數清單中的,用逗點隔開。清單中的每個名稱必須是唯一,且清單必須以括號括住。不能是空格可以區隔識別項及左括弧。使用行串連 — 放置一個反斜線 (\) 之前的新行字元 — 為 long 的指示詞的多個原始程式行。型式參數名稱的範圍將延伸至新行結尾的語彙基元字串。

當巨集已經在第二種語法形式時,後續文字例項,後面跟著引數清單會指出巨集呼叫。接下來的執行個體的實質引數識別項原始程式檔中就會對應到在巨集定義中對應的型式參數。在每個型式參數語彙基元字串 ,不加 stringizing (#)、 charizing (#@),或語彙基元貼上 (##) 運算子,或沒有跟隨著##運算子,就會取代對應的實質引數。之前的指示詞會取代型式參數,就會展開任何實際的引數中的巨集。(這些運算子所述前置處理器運算子。)

下列範例巨集引數的說明第二種#define語法:

// 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))

使用有副作用的引數有時會造成巨集來產生不可預期的結果。指定的型式參數可能會出現一個以上的時間,以語彙基元字串。如果替代該型式參數具有副作用的運算式,運算式中的會有其副作用,可能會評估一次以上。(請參閱下的範例語彙基元貼上運算子 (#)。)

#undef指示詞會使識別項的前置處理器定義,以世人遺忘。請參閱 # undef 指示詞如需詳細資訊。

如果所定義的巨集的名稱就會發生在語彙基元字串 (甚至可能是其他的巨集展開),它不會擴展。

第二個#define的巨集具有相同的名稱會產生警告,除非第二個語彙基元順序是第一個完全相同。

Microsoft 專有的

Microsoft C/C++ 可讓您能重新定義巨集,如果新的定義語法相同原始定義。換句話說,這兩個定義都可以有不同的參數名稱。這個行為不同於ANSI c,而這兩個定義是語彙上相同。

例如,下列兩個巨集除了都相同的參數名稱。ANSIC 不允許這類的關係,但是 Microsoft C/C++ 編譯它不會發生錯誤。

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

相反地,下列兩個巨集並不相同,並會在 Microsoft C/C++ 產生警告。

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

結束 Microsoft 特定

此範例將說明#define指示詞:

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

第一個陳述式會定義識別項WIDTH為整數常數 80,並定義LENGTH的角度來看WIDTH與整數常數的 10。出現的每個LENGTH會取代 (WIDTH + 10)。在開啟時,出現的每個WIDTH + 10會被取代的運算式 (80 + 10)。括號括WIDTH + 10是很重要,因為它們來控制解譯,如下所示的陳述式中:

var = LENGTH * 20;

前置處理階段陳述式之後就會變成:

var = ( 80 + 10 ) * 20;

它會評估為 1800年。如果沒有括弧,結果是:

var = 80 + 10 * 20;

它會評估為 280。

Microsoft 專有的

定義巨集和使用常數 /D 編譯器選項都有相同的效果與使用#define在檔案開頭的前置處理器指示詞。最多到 30 的巨集可以使用 /D 選項來定義。

結束 Microsoft 特定

請參閱

參考

前置處理器指示詞