Попробуйте это
#define space_conc(str1,str2) #str1 " " #str2
'##' используется для объединения символов, а не строк. Строки можно просто сопоставить в C, и компилятор объединит их, что и делает этот макрос. Сначала преобразует str1 и str2 в строки (скажем, «hello» и «world», если вы используете их так space_conc(hello, world)
) и размещает их рядом друг с другом, вставляя между ними простую строку с одним пробелом. То есть результирующее расширение будет интерпретироваться компилятором как это
"hello" " " "world"
, который будет соединен с
"hello world"
НТН
Редактировать
Для полноты, оператор '##' в раскрытии макроса используется следующим образом, скажем, у вас есть
#define dumb_macro(a,b) a ## b
приведет к следующему, если будет называться dumb_macro(hello, world)
helloworld
, который не является строкой, но символом, и вы, вероятно, в итоге получите неопределенную ошибку символа, говорящую, что «helloworld» не существует, если вы не определили его сначала. Это было бы законно:
int helloworld;
dumb_macro(hello, world) = 3;
printf ("helloworld = %d\n", helloworld); // <-- would print 'helloworld = 3'