Макрос для объединения двух строк в C - PullRequest
21 голосов
/ 03 февраля 2010

Я пытаюсь определить макрос, который должен принимать 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", предложения?

Ответы [ 3 ]

48 голосов
/ 03 февраля 2010

Попробуйте это

#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'
5 голосов
/ 03 февраля 2010
#define space_conc(str1, str2) #str1 " " #str2
printf("%s", space_conc(hello, you)); // Will print "hello you"
0 голосов
/ 04 мая 2016

Право было сделать это - поместить две строки одну рядом с другой. «##» не сработает. Просто:

#define concatenatedstring string1 string2
...