Sdílet prostřednictvím


Operátor nastavení velikosti řetězce (#)

Znak čísla neboli operátor "převodu na řetězec" (#) převede parametry maker na řetězcové literály bez rozvíjení definice parametru.Používá se pouze spolu s makry, která přijímají 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ší), v ně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 opírající se o toto rozšíření by měl být přepsán pomocí operátoru převodu na řetězec (#).

Prázdný znak před prvním a za posledním tokenem skutečného argumentu je ignorován.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.Proto vyskytne-li se mezi dvěma tokeny ve skutečném argumentu komentář, je redukován na jediný prázdný znak.K výslednému řetězcovému literálu jsou automaticky připojeny všechny sousedící řetězcové literály, od nichž je výsledný literál oddělen pouze prázdnými znaky.

Dále, pokud znak obsažený v argumentu při použití v řetězcovém literálu obvykle vyžaduje řídicí sekvenci (například znak uvozovky " nebo zpětného lomítka \), je potřebné zpětné lomítko před něj vloženo automaticky.

V některých situacích se operátor převodu na řetězec nemusí chovat dle očekávání. Další informace naleznete v tématu 16.3.2 # – operátor.

Příklad

Následující příklad ukazuje definici makra obsahující operátor převodu na řetězec a hlavní funkci, která makro volá:

Taková volání by byla rozvinuta během předběžného zpracování a vytvořila by následující kód:

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

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)

Viz také

Referenční dokumentace

Operátory preprocesoru