Operator tworzenia ciągów (#)

Operator znaku liczbowego lub "stringizing" (#) konwertuje parametry makra na literały ciągu bez rozszerzania definicji parametru. Jest on używany tylko w przypadku makr, 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 polegał na tym rozszerzeniu, powinien zostać przepisany przy użyciu operatora stringizing (#).

Biały znak poprzedzający pierwszy token i następuje po ostatnim tokenie rzeczywistego argumentu jest ignorowany. Wszelkie odstępy między tokenami w rzeczywistym argumencie są skracane do pojedynczego odstępu w wynikowym literale ciągu. W związku z tym, jeśli komentarz występuje między dwoma tokenami w rzeczywistym argumencie, zostanie zredukowany do pojedynczego odstępu. Wynikowy literał ciągu jest automatycznie połączony z dowolnymi sąsiednimi literałami ciągu, które są oddzielone tylko białym znakiem.

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

Operator ciągowania języka Microsoft C++ nie działa prawidłowo, gdy jest używany z ciągami, które zawierają sekwencje ucieczki. W takiej sytuacji kompilator generuje błąd kompilatora C2017.

Przykłady

W poniższym przykładzie przedstawiono definicję makr, która zawiera operator ciągowania i funkcję główną, która wywołuje makro:

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

Makra stringer są rozszerzane podczas przetwarzania wstępnego, tworząc następujący kod:

int main() {
   printf_s( "In quotes in the printf function call" "\n" );
   printf_s( "\"In quotes when printed to the screen\"" "\n" );
   printf_s( "\"This: \\\" prints an escaped double quote\"" "\n" );
}
In quotes in the printf function call
"In quotes when printed to the screen"
"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ż

Operatory preprocesora