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)