Udostępnij za pośrednictwem


Operator tworzenia ciągów (#)

Znak numeru lub operator "tworzenia ciągów" (#) konwertuje parametry makr do literałów ciągu bez rozszerzania definicji parametru.Jest on używany tylko z makrami, które przyjmują argumenty.Jeżeli poprzedza on parametr formalny w definicji makra, rzeczywisty argument przekazywany przez wywołanie makra jest ujęty w znaki cudzysłowu i traktowany jako literał ciągu.Literał ciągu następnie zamienia każde wystąpienie kombinacji operatora tworzenia ciągu i parametru formalnego w ramach definicji makra.

[!UWAGA]

Rozszerzenie Microsoft C (wersje 6.0 i starsze) dla standardu ANSI C, które wcześniej rozszerzało argumenty formalne makra pojawiające się wewnątrz literałów ciągu i stałych ciągu, nie jest już obsługiwane.Kod, który opiera się na tym rozszerzeniu powinien zostać przepisany z użyciem operatora (#).

Biały znak poprzedzający pierwszy token rzeczywistego argumentu i występujący po ostatnim tokenie rzeczywistego argumentu jest ignorowany.Wszelkie białe znaki między tokenami w rzeczywistym argumencie są skracane do pojedynczego białego znaku w wynikowym literale ciągu.Tak więc jeśli komentarz występuje między dwoma tokenami w rzeczywistym argumencie, jest on skracany do pojedynczego białego znaku.Wynikowy literał ciągu jest automatycznie łączony z dowolnymi przylegającymi literałami ciągu, od których jest on oddzielony białym znakiem.

Dalej, jeśli znak zawarty w argumencie zwykle wymaga sekwencji ucieczki podczas użycia w ramach literału ciągu (na przykład znak cudzysłowu (") lub znak ukośnika odwrotnego (\)), niezbędny ukośnik odwrotny ucieczki jest automatycznie wstawiany przed znakiem.

Operator tworzenia ciągów w Visual C++ może nie zachowywać się zgodnie z oczekiwaniami we wszystkich sytuacjach; zobacz 16.3.2 # — operator, aby uzyskać więcej informacji.

Przykład

W poniższym przykładzie pokazano definicję makra, która zawiera operator tworzenia ciągu i główną funkcję, która wywołuje makro:

Takie wywołania będą rozwijane podczas wstępnego przetwarzania, generując poniższy kod:

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" );
}
  

W poniższym przykładzie pokazano sposób rozwijania parametru makra:

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

Zobacz też

Informacje

Operatory preprocesora