Macro per concatenare due stringhe in C

Sto provando a definire una macro che suppone prendere 2 valori di stringa e restituirli concatenati con uno spazio tra loro. Sembra che io possa usare qualsiasi personaggio che voglio oltre allo spazio, ad esempio:

#define conc(str1,str2) #str1 ## #str2 #define space_conc(str1,str2) conc(str1,-) ## #str2 space_conc(idan,oop); 

space_conc restituirebbe “idan-oop”

Voglio qualcosa da restituire “idan oop”, suggerimenti?

Prova questo

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

Il ‘##’ è usato per concatenare simboli, non stringhe. Le stringhe possono semplicemente essere giustapposte in C, e il compilatore le concatena, che è ciò che fa questa macro. Prima trasforma str1 e str2 in stringhe (diciamo “ciao” e “mondo” se lo usi come questo space_conc(hello, world) ) e le colloca una accanto all’altra con la semplice stringa di spazio singolo tra loro. Cioè, l’espansione risultante sarebbe interpretata dal compilatore in questo modo

 "hello" " " "world" 

a cui si concatenerà

 "hello world" 

HTH

modificare
Per completezza, l’operatore ‘##’ nell’espansione macro viene usato in questo modo, supponiamo di avere

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

risulterà nel seguente se chiamato come dumb_macro(hello, world)

 helloworld 

che non è una stringa, ma un simbolo e probabilmente finirai con un errore di simbolo non definito che dice “helloworld” non esiste se non lo definisci per primo. Questo sarebbe legale:

 int helloworld; dumb_macro(hello, world) = 3; printf ("helloworld = %d\n", helloworld); // <-- would print 'helloworld = 3' 
 #define space_conc(str1, str2) #str1 " " #str2 printf("%s", space_conc(hello, you)); // Will print "hello you" 

Il diritto era quello di mettere le 2 stringhe una accanto all’altra. ‘##’ non funzionerà. Appena:

 #define concatenatedstring string1 string2