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

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

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

space_conc(idan,oop);

space_conc возвратил бы "idan-ООП"

Я хочу, чтобы что-то возвратило "idan ООП", предложения?

21
задан a3f 31 March 2015 в 02:59
поделиться

2 ответа

Попробуйте

#define space_conc(str1,str2) #str1 " " #str2

«##» используется для объединения символов, а не строк. Строки могут просто быть сопоставляемыми в C, а компилятор будет объединять их, что делает этот макрос. Сначала поворачивает str1 и str2 на струны (скажем, "привет" и "мир", если вы используете его как это Space_conc (Hello, World) ) и помещает их рядом друг с другом с простым односпальным пространством струна между ними. То есть полученное расширение будет интерпретировано компилятором, подобным этим

"hello" " " "world"

, которое он объединяет в

"hello world"

HTH

редактировать
для полноты, оператор «##» в макросъемке используется как это Давайте скажем, у вас есть

#define dumb_macro(a,b) a ## b

, приведет к следующему, если вы назвать DUBL_MACRO (Hello, World)

helloworld

, который не является строкой, а символом, и вы, вероятно, в конечном итоге с неопределенной ошибкой символа «Helloworld» не существует, если вы не определите его первым. Это было бы законным:

int helloworld;
dumb_macro(hello, world) = 3;
printf ("helloworld = %d\n", helloworld); // <-- would print 'helloworld = 3'
48
ответ дан 29 November 2019 в 06:54
поделиться
#define space_conc(str1, str2) #str1 " " #str2
printf("%s", space_conc(hello, you)); // Will print "hello you"
5
ответ дан 29 November 2019 в 06:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: