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