Operador de generación de cadenas (#)

El número-signo o el operador “de generación de cadenas” (#) convierte parámetros macros a los literales de cadena sin expandir la definición de parámetros.Se utiliza únicamente con las macros que toman argumentos.Si precede un parámetro formal de la definición de macro, el argumento real pasado por la llamada de macro entre comillas y trata como literal de cadena.El literal de cadena a continuación reemplaza cada aparición de una combinación del operador de generación de cadenas y parámetro formal dentro de la definición de macro.

[!NOTA]

La extensión de Microsoft c (versiones 6,0 y anteriores) al estándar ANSI C que los argumentos formales macros previamente expandida que aparece literales de cadena y las constantes de caracteres interiores no se admite.El código que dependía de esta extensión se debe volver a escribir mediante el operador de generación de cadenas (de#).

El espacio en blanco que precede al primer símbolo de argumento real y después de símbolo el último argumento real se omite.Cualquier espacio en blanco entre los tokens en el argumento real se reduce a un único espacio en blanco en el literal de cadena resultante.Así, si un comentario aparece entre dos tokens en el argumento real, se reduce a un único espacio en blanco.El literal de cadena resultante se concatena con un literal de cadena adyacente de las que sea independiente sólo el espacio en blanco.

Además, si un carácter contenido en el argumento normalmente requiere una secuencia de escape cuando se utiliza en un literal de cadena (por ejemplo, las comillas dobles () o carácter de barra diagonal inversa (\)), barra diagonal inversa necesaria de escape se insertará automáticamente antes del carácter.

Visual C++ de generación de cadenas el operador no puede comportarse como se espera en todas las situaciones; vea 16.3.2 # Operador para obtener más información.

Ejemplo

El ejemplo siguiente se muestra una definición de macro que incluya el operador de generación de cadenas y una función principal que invoca la macro:

Tales invocaciones se expandieron durante el preprocesamiento, generar el código siguiente:

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

El ejemplo siguiente se muestra cómo puede expandir un parámetro 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)

Vea también

Referencia

Operadores de preprocesador