2009-07-03 19 views
12

¿Hay alguna manera de hacer que el preprocesador C++ expanda un # valor definido en un literal de cadena?
por ejemplo:¿Se puede expandir # define's en literales de cadena?

#define NEW_LINE '\n' 
Printf("OutputNEW_LINE"); //or whatever 

Esto me parece que debería ser posible ya que es antes de la compilación?
¿O hay un mejor patrón de diseño para lograr este tipo de comportamiento (sin recurrir a correcciones de tiempo de ejecución como sprintf)?

EDITAR entiendo que #define de puede ser malo, pero para bien de los argumentos ...

ADICIONAL ¿Alguien tiene alguna crítica de este enfoque?

+0

@GMan ¿Alguna alternativa 'menos fea'? –

+5

Bueno, puedes usar \ n directamente en Strings. El estándar C exige que este carácter único se expanda a lo que la plataforma utilice como delimitador de línea/terminador, al menos cuando se escribe en archivos de texto y en la consola. – Joey

Respuesta

25

Esto lo hará:

#define NEW_LINE "\n"   // Note double quotes 
Printf("Output" NEW_LINE); 

(técnicamente es el compilador de unirse a las cadenas más que el preprocesador, pero el resultado final es el mismo.)

6

si no recuerdo mal es

Printf("Output" NEW_LINE); 
+0

Entonces, ¿esto se ampliará en el momento de la creación, no a través de las instalaciones de impresión de Printf? –

+3

Sí, el compilador C concatenará automáticamente literales de cadena adyacentes, aunque el #define debería definir NEW_LINE como "\ n" y no '\ n' para que eso funcione, creo. – Joey

+0

¿Por qué el voto a favor, solo por impresión en mayúscula? – Kosi2801

2

Puede hacer lo siguiente.

#define NEW_LINE "\n" 
printf("Output" NEW_LINE); 
-1

Bueno ....

printf("Output%s", NEW_LINE); 
+0

Esto sería un tiempo de ejecución arreglar –

+0

exactamente, pero mucho más fácil de mantener en el largo plazo :) –

+0

mmmm ... En realidad, todavía tendría que recompilar todo si el #define cambia y la coma faltante no debería causar problemas si algo en el el texto cambia, ya que aún puede agregar marcadores de posición y variables sin romper algo. Al menos en mi opinión. – Kosi2801

1
#define NEW_LINE "\n" 
printf("Output" NEW_LINE); //or whatever 

debe hacer el truco.

Cuestiones relacionadas