Почему inner_LOAD_ATOM(buffer, ATOM_MAX)
преобразован в scanf("%" "ATOM_MAX" "s", x)
, но завернутая версия isnt? Я ожидал бы, что ATOM_MAX (идентификатор) будет заменен на 10 до того, как он «пройдет» до inner_LOAD_ATOM
или LOAD_LINE
и сделает оболочку бесполезной. Более подробный ответ, почему необходима обертка, будет очень оценен.Macro строит предыдущий идентификатор макроса вместо его замены
#include <stdio.h>
#define ATOM_MAX 10
#define inner_LOAD_ATOM(x, y) scanf("%" #y "s", x) /* inner part */
#define LOAD_ATOM(x, y) inner_LOAD_ATOM(x, y) /* wrapper of inner_LOAD_ATOM */
int main(void)
{
char buffer[ATOM_MAX] = {0, };
/* wrapped works fine */
LOAD_ATOM(buffer, ATOM_MAX);
/* [Warning] unknown conversion
type character 'A' in format [-Wformat=] */
inner_LOAD_ATOM(buffer, ATOM_MAX);
printf("%s\n", buffer);
return 0;
}