Я пытаюсь определить макрос, который является, предполагают, чтобы принять 2 строковых значения и возвратить их связанный с одним пространством между ними. Кажется, что я могу использовать любой символ, который я хочу помимо пространства, например:
#define conc(str1,str2) #str1 ## #str2
#define space_conc(str1,str2) conc(str1,-) ## #str2
space_conc(idan,oop);
space_conc
возвратил бы "idan-ООП"
Я хочу, чтобы что-то возвратило "idan ООП", предложения?
Попробуйте
#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'
#define space_conc(str1, str2) #str1 " " #str2
printf("%s", space_conc(hello, you)); // Will print "hello you"