Stringizing 運算子 (#)
數字符號或"字串化 」 運算子 (#) 沒有展開參數定義情況下,將巨集的參數轉換成字串常值。 它只能搭配使用引數的巨集。 如果它之前的巨集定義中的型式參數,是以引號括住巨集引動過程所傳遞的實際引數,並將其視為常值字串。 然後,字串常值會取代每個出現的字串化運算子和巨集定義中的型式參數的組合。
注意事項 |
---|
不再支援 ANSI C 標準的 Microsoft C (版本 6.0 及較早版本) 擴充功能,先前展開 [巨集型式引數出現在字串常值和字元常數。這對仰賴此擴充功能的程式碼應該加以改寫使用 stringizing (#) 運算子。 |
前面將實際引數,並遵照實質引數的最後一個語彙基元的第一個語彙基元的泛空白字元會被忽略。 語彙基元中實際的引數之間的任何泛空白字元會減少到產生的字串常值中的單一空格。 因此,如果註解之間的實際引數中的兩個語彙基元,它會減少到單一的泛空白字元。 要從中它只以泛空白字元分隔的任何相鄰字串常值會自動連接產生的字串常值。
進一步,如果通常包含引數中的字元都需要在字串常值中使用時的逸出序列 (比方說,在引號 (') 或反斜線符號 (\) 字元),必要的逸出的反斜線會自動插入的字元之前。
Visual C++ 字串化運算子可能無法如預期般在所有情況下。 請參閱16.3.2 # Operator如需詳細資訊。
範例
下列範例顯示包含字串化運算子和 main 函式叫用巨集的巨集定義:
這類引動過程會展開在前置處理,產生下列的程式碼:
int main() {
printf_s( "In quotes in the printf function call\n" "\n" );
printf_s( "\"In quotes when printed to the screen\"\n" "\n" );
printf_s( "\"This: \\\" prints an escaped double quote\"" "\n" );
}
// stringizer.cpp
#include <stdio.h>
#define stringer( x ) printf_s( #x "\n" )
int main() {
stringer( In quotes in the printf function call );
stringer( "In quotes when printed to the screen" );
stringer( "This: \" prints an escaped double quote" );
}
下列範例會示範如何,您可以展開的巨集的參數:
// stringizer_2.cpp
// compile with: /E
#define F abc
#define B def
#define FB(arg) #arg
#define FB1(arg) FB(arg)
FB(F B)
FB1(F B)