Udostępnij za pośrednictwem


Stringizing operatora (#)

Numer rejestracji lub operatora "stringizing" (#) konwertuje makra parametrów literały ciągów znaków bez rozwijania definicji parametru.Służy on tylko z makra, które argumenty.Jeżeli poprzedza ono parametrów formalnych w definicji makra, rzeczywiste argumentu przekazanego przez wywołanie makra jest ujęty w cudzysłów i traktowana jako literał ciągu znaków.Literał ciągu znaków następnie zamienia każde wystąpienie kombinacji stringizing operatora i parametrów formalnych w definicji makra.

[!UWAGA]

Rozszerzenia Microsoft C (w wersji 6.0 i starsze) na ANSI C standard, które wcześniej rozwinięta Argumenty formalne makr znajdujących się wewnątrz literały ciągów znaków i stałych znaków nie jest już obsługiwany.Kod, który opiera się tego rozszerzenia powinno przepisany przy użyciu stringizing (#) operatora.

Odstępu poprzedzającego pierwszy token argument rzeczywiste i w następstwie ostatniego tokena rzeczywiste argument jest ignorowany.Dowolny odstęp między tokenów w rzeczywistym argumentem jest zredukowana do pojedyncze światło w wynikowy ciąg literału.W ten sposób Jeśli komentarz występuje między dwa tokeny w argumencie rzeczywiste, jest zmniejszone do pojedynczej spacji.Wynikowy ciąg literału jest automatycznie łączone z dowolnym literały ciągów znaków sąsiadujących, od których jest ona oddzielona tylko przez światło.

Ponadto, jeśli znak zawartych w argumencie zazwyczaj wymaga sekwencji unikowej, gdy użyte w literał ciągu znaków (na przykład znak cudzysłowu ("") lub kreska ułamkowa odwrócona (\) znaków), odwrotnej kreski ukośnej escape niezbędne jest automatycznie wstawiany przed tym znakiem.

Operator stringizing 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

Definicja makra, zawierającą stringizing operator i głównych funkcji, która wywołuje makro można znaleźć w poniższym przykładzie:

Wywołania takie byłyby rozwinięte podczas wstępnego przetwarzania, produkujących następujący 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" );
}
  

Następujący przykład przedstawia, w jaki sposób można rozwinąć parametr 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