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ż
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla