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