Operátor převádějící na řetězec (#)
Operátor číslo-znaménko nebo "stringizing" (#) převede parametry makra na řetězcové literály bez rozbalení definice parametru. Používá se jenom s makry, která přebírají argumenty. Je-li operátor uveden v definici makra před formálním parametrem, je skutečný argument předaný voláním makra uzavřen do uvozovek a považován za řetězcový literál. Řetězcový literál pak nahradí všechny výskyty kombinace operátoru převodu na řetězec a formálního parametru v definici makra.
Poznámka:
Rozšíření standardu ANSI jazyka C společností Microsoft (verze 6.0 a starší), ve kterém byly dříve rozvíjeny formální argumenty maker uvnitř řetězcových literálů a znakových konstant, již není podporováno. Kód, který se na toto rozšíření spoléhal, by se měl přepsat pomocí operátoru stringizing (#).
Prázdné místo, které předchází prvnímu tokenu a následuje poslední token skutečného argumentu, se ignoruje. Všechny prázdné znaky mezi tokeny ve skutečném argumentu jsou ve výsledném řetězcovém literálu redukovány na jediný prázdný znak. Pokud se tedy komentář vyskytuje mezi dvěma tokeny ve skutečném argumentu, zmenší se na jednu mezeru. Výsledný řetězcový literál je automaticky zřetězen s libovolnými sousedními řetězcovými literály, které jsou oddělené pouze prázdnými znaky.
Dále platí, že pokud znak obsažený v argumentu obvykle vyžaduje řídicí sekvenci při použití v řetězcovém literálu, například uvozovky ("
) nebo zpětné lomítko () znaku\
, je nezbytné řídicí zpětné lomítko automaticky vloženo před znak.
Operátor pro řetězcovou změnu jazyka Microsoft C++ se při použití s řetězci, které obsahují řídicí sekvence, nechová správně. V takovém případě kompilátor generuje chybu kompilátoru C2017.
Příklady
Následující příklad ukazuje definici makra, která obsahuje operátor stringizing a hlavní funkci, která makro vyvolá:
// 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
se během předběžného zpracování rozbalí a vytvoří následující kód:
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"
Následující příklad ukazuje, jak lze rozvinout 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)