Я изучаю, как использовать макросы, и теперь столкнулся с некоторым (скорее всего, неопределенным) поведением. Вот пример:
#include <stdio.h>
#define FOO(a, b) { \
printf("%s%s\n", #a #b); \
} \
int main(int argc, char * argv[]){
{ printf("%s%s\n", 1 2); } //compile error
FOO(1, 2); //prints 12 with some garbage
}
Скорее всего, у меня UB, но я копаюсь в N1570 не дал четкого объяснения этому. Самое близкое к этому, что я нашел, было 5.1.1.2(p4)
:
Выполняются директивы предварительной обработки, расширяются вызовы макросов и выполняются выражения унарных операторов _Pragma. Если последовательность символов, соответствующая синтаксису универсального имени символа, создается конкатенацией токенов (6.10.3.3), поведение не определено.
Вероятно, токены "1" "2"
были объединены в UB, но я не уверен.
%s
вы получаете автоматически объединенный"12"
, а для второго%s
у вас ничего не осталось, поэтому для этого вы печатаете мусор. Попробуйтеprintf("%s%s\n", #a, #b);
с,
между#a
и#b
. - person Blaze   schedule 10.01.2019