2010-02-03 29 views
21

Estoy tratando de definir una macro que se supone que debe tomar 2 valores de cadena y devolverlos concatenados con un espacio entre ellos. Parece que puedo utilizar cualquier carácter que quiero aparte del espacio, por ejemplo:Macro para concatenar dos cadenas en C

#define conc(str1,str2) #str1 ## #str2 
#define space_conc(str1,str2) conc(str1,-) ## #str2 

space_conc(idan,oop); 

space_conc volvería "Idan-oop"

quiero algo para volver "Idan oop", sugerencias?

Respuesta

48

probar este

#define space_conc(str1,str2) #str1 " " #str2 

El '##' se utiliza para concatenar los símbolos, no cadenas. Las cadenas pueden simplemente yuxtaponerse en C, y el compilador las concatenará, que es lo que hace esta macro. Primero convierte str1 y str2 en cadenas (digamos "hola" y "mundo" si lo usa así space_conc(hello, world)) y los coloca uno al lado del otro con la cadena simple de un espacio entremedio. Es decir, la expansión resultante sería interpretado por el compilador como esto

"hello" " " "world" 

que se va a concatenar

"hello world" 

HTH

Editar
Para completar, el '# # 'operador en macro expansión se usa así, digamos que tiene

#define dumb_macro(a,b) a ## b 

dará lugar a la siguiente si es llamado como dumb_macro(hello, world)

helloworld 

que no es una cadena, sino un símbolo y que probablemente va a terminar con un error de símbolo no definido diciendo 'Hola Mundo' no existe a menos tu lo defines primero Esto sería legal:

int helloworld; 
dumb_macro(hello, world) = 3; 
printf ("helloworld = %d\n", helloworld); // <-- would print 'helloworld = 3' 
+2

Tenga en cuenta que esto no es necesariamente tonta si está haciendo algo como 'dumb_macro (mypackage, mifuncion)' ... –

+0

@R, por supuesto, el concepto tiene usos, pero es generalmente conectada. a algún otro valor semántico, o la opción de reemplazar la macro con otra cosa (como, por ejemplo, para la depuración). No quería sumergirme en algo así, así que este en particular es solo una tonta macro concatenando dos nombres de símbolos sin ningún propósito real ... :) – falstro

+0

whoa esa es una gran respuesta. Quería saber cómo hacer esa concatenación de símbolos. Es realmente útil. – Anubis

5
#define space_conc(str1, str2) #str1 " " #str2 
printf("%s", space_conc(hello, you)); // Will print "hello you" 
0

El derecho era hacerlo es colocar las 2 cadenas, una al lado de la otra. '##' no funcionará. Simplemente:

#define concatenatedstring string1 string2 
Cuestiones relacionadas