Operatore per la creazione di stringhe (#)
L'operatore number-sign o "stringizing" (#) converte i parametri macro in valori letterali stringa senza espandere la definizione del parametro. Viene usato solo con macro che accettano argomenti. Se questo operatore precede un parametro formale nella definizione della macro, l'argomento effettivo passato alla chiamata della macro viene racchiuso tra virgolette singole e considerato come un valore letterale stringa. Il valore letterale stringa sostituisce quindi ogni occorrenza di una combinazione dell'operatore per la creazione di stringhe e del parametro formale nella definizione di macro.
Nota
L'estensione Microsoft C (versione 6.0 e precedenti) allo standard ANSI C che in precedenza espandeva gli argomenti formali di macro presenti in valori letterali stringa e in costanti carattere non è più supportata. Il codice basato su questa estensione deve essere riscritto usando l'operatore di stringizzazione (#).
Lo spazio vuoto che precede il primo token e segue l'ultimo token dell'argomento effettivo viene ignorato. Tutti gli spazi vuoti tra i token dell'argomento effettivo vengono ridotti a un singolo spazio vuoto nel valore letterale stringa risultante. Pertanto, se un commento si verifica tra due token nell'argomento effettivo, viene ridotto a un singolo spazio vuoto. Il valore letterale stringa risultante viene concatenato automaticamente con tutti i valori letterali stringa adiacenti separati solo da spazi vuoti.
Inoltre, se un carattere contenuto nell'argomento richiede in genere una sequenza di escape quando viene utilizzata in un valore letterale stringa, ad esempio, il carattere virgolette ("
) o barra rovesciata (\
), la barra rovesciata di escape necessaria viene inserita automaticamente prima del carattere.
L'operatore di stringing di Microsoft C++ non si comporta correttamente quando viene usato con stringhe che includono sequenze di escape. In questo caso, il compilatore genera l'errore del compilatore C2017.
Esempi
Nell'esempio seguente viene illustrata una definizione di macro che include l'operatore di stringing e una funzione main che richiama la macro:
// 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" );
}
Le stringer
macro vengono espanse durante la pre-elaborazione, producendo il codice seguente:
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"
Nell'esempio di codice seguente viene mostrato come è possibile espandere un parametro di macro:
// 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)