Вероятно, токены "1", "2" были объединены, что дало UB, но я не уверен.
Вы правы.
«1» и «2» стали «12» и перешли к первому %s
в printf()
. Затем второй %s
не имеет ничего для обработки, таким образом, значения мусора.
Предупреждения компилятора тоже согласны (конечно):
prog.cc:4:12: warning: format '%s' expects a matching 'char*' argument [-Wformat=]
4 | printf("%s%s\n", #a #b); \
| ^~~~~~~~
prog.cc:9:5: note: in expansion of macro 'FOO'
9 | FOO(1, 2); //prints 12 with some garbage
| ^~~
prog.cc:4:16: note: format string is defined here
4 | printf("%s%s\n", #a #b); \
| ~^
| |
| char*
В вашем макросе измените это:
printf("%s%s\n", #a #b);
к этому:
printf("%s%s\n", #a, #b);
где запятая поможет, как прокомментировал @Blaze. Live Demo
Примечание: для жестко закодированного printf()
вызова на работу вы хотели бы сделать 1 и 2 строки; использование запятой будет недостаточно. Пример: printf("%s%s\n", "1", "2");
.