Stringizing operador (#)
O sinal de número ou o operador "stringizing" (#) converte os parâmetros de macro em literais de seqüência de caracteres sem expandir a definição do parâmetro.Ele é usado somente com macros que obtém argumentos.Se ela precede um parâmetro formal na definição de macro, o argumento passado por meio da chamada a macro é colocado entre aspas e tratado como uma seqüência de caracteres literal.A seqüência literal, em seguida, substitui cada ocorrência de uma combinação de parâmetro formal dentro da definição de macro e o operador de stringizing.
Observação |
---|
A extensão do Microsoft C (versões 6.0 e anteriores) para o padrão ANSI C que anteriormente expandida argumentos formais de macro que aparecem dentro de literais de seqüência de caracteres e constantes de caractere não é mais suportada.Código que contava com essa extensão deve ser reescrito usando o stringizing (#) operador. |
Espaço em branco que precede o primeiro símbolo do argumento real e seguindo o último símbolo do argumento real será ignorado.Qualquer espaço em branco entre os tokens no argumento real é reduzido a um único espaço em branco da literal de seqüência resultante.Assim, se um comentário ocorrer entre dois tokens no argumento real, é reduzida para um único espaço em branco.A literal de seqüência resultante automaticamente é concatenada com qualquer literais de seqüência de caracteres adjacentes do qual ele é separado somente pelo espaço em branco.
Além disso, se um caractere contido no argumento geralmente requer uma seqüência de escape quando usado em uma seqüência de caracteres literal (por exemplo, as aspas (") ou barra invertida (\) caracteres), necessários de escape barra invertida é inserida automaticamente antes do caractere.
O operador de stringizing do Visual C++ pode não se comportar conforme o esperado em todas as situações. consulte 16.3.2 A # Operator para obter mais informações.
Exemplo
O exemplo a seguir mostra uma definição de macro que inclui o operador de stringizing e uma função main que invoca a macro:
Tais invocações poderiam ser expandidas durante o pré-processamento, produzindo o código a seguir:
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" );
}
O exemplo a seguir mostra como um parâmetro de macro pode ser expandido:
// 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)