Подтвердить что ты не робот

Макрос для конкатенации двух строк в C

Я пытаюсь определить макрос, который предположил бы взять 2 строковых значения и вернуть их, объединенные одним пространством между ними. Кажется, я могу использовать любой символ, который я хочу, помимо пространства, например:

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

space_conc(idan,oop);

space_conc вернет "idan-oop"

Я хочу что-то вернуть "idan oop", предложения?

4b9b3361

Ответ 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'

Ответ 2

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

Ответ 3

Право было сделать это, чтобы поместить 2 строки один рядом друг с другом. "##" не будет работать. Просто:

#define concatenatedstring string1 string2