Это из-за правил оценки для макросов. Вы должны определить какой-то вспомогательный макрос, который получает число в виде токена:
#define HELLO_1(N, ...) hello ## N
#define HELLO_0(N, ...) HELLO_1(N, __VARGS__)
#define HELLO(...) HELLO_0(PP_NARG(__VA_ARGS__), __VARGS__)
или около того. Вы также можете заглянуть в предварительный выпуск документации P99 . Это предоставит вам более удобные инструменты макросов, чтобы сделать это напрямую.