Operador stringizing (#)

O operador de sinal de número ou “stringizing” (#) converte parâmetros de macro em literais de cadeia de caracteres sem expanda a definição do parâmetro. É usado apenas com macros que aceitam argumentos. Se ele preceder um parâmetro formal na definição da macro, o argumento real passado por invocação de macro é colocado entre em aspas e tratado como literal de cadeia de caracteres. O literal da cadeia de caracteres substitui cada ocorrência de uma combinação do operador stringizing e do parâmetro formal na definição da macro.

Observação

A extensão do Microsoft C (versões 6.0 e anteriores) para o padrão ANSI C, que anteriormente expandia os argumentos formais de macro que apareciam em literais de cadeias de caracteres e constantes de caracteres, não tem mais suporte. O código que usava esta extensão tinha de ser recriado usando o operador stringizing (#).

O espaço em branco que precede o primeiro token e segue o último token do argumento real é ignorado. Todo o espaço em branco entre os tokens no argumento real é reduzido a um único espaço em branco no literal de cadeia de caracteres resultante. Assim, se um comentário ocorrer entre dois tokens no argumento real, ele será reduzido a um só espaço em branco. O literal de cadeia de caracteres resultante é concatenada automaticamente com os literais de cadeia de caracteres adjacentes separados apenas por espaço em branco.

Além disso, se um caractere contido no argumento exigir normalmente uma sequência de escape quando usado em um literal de cadeia de caracteres, por exemplo, aspas (") ou um caractere de barra invertida (\), a barra invertida de escape necessária é automaticamente inserida antes do caractere.

O operador de stringizing do Microsoft C++ não se comporta corretamente quando é usado com cadeias de caracteres que incluem sequências de escape. Nessa situação, o compilador gera o Erro do Compilador C2017.

Exemplos

O seguinte exemplo mostra uma definição macro que inclui o operador stringizing e uma função main que invoca a 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" );
}

As macros stringer são expandidas durante o pré-processamento, produzindo o seguinte código:

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"

O exemplo a seguir mostra como você pode expandir um parâmetro de 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)

Confira também

Operadores de pré-processador