Я пытаюсь понять подсчет аргументов в макросе предварительной обработки C и идею этого ответа . У нас есть следующий макрос (я изменил количество аргументов для простоты):
#define HAS_ARGS(...) HAS_ARGS_(__VA_ARGS__, 1, 1, 0,)
#define HAS_ARGS_(a, b, c, N, ...) N
Насколько я понимаю, цель этого макроса состоит в том, чтобы проверить, пустые ли varargs. Таким образом, в пустых varargs вызов макроса заменяется на 0, что кажется нормальным. Но с одним аргументом он также превращается в 0, что мне кажется странным.
HAS_ARGS(); //0
HAS_ARGS(123); //also 0
HAS_ARGS(1, 2); //1
LIVE DEMO
Кажется, я понимаю причину. В случае пустых varargs a
заменяется пустым токеном предварительной обработки, в случае одного аргумента vararg a заменяется аргументом, дающим тот же результат.
Есть ли способ получить 0
, возвращаемый в случае, если переменные varargs пусты, 1 в случае, если номер аргумента от 1 до определенного в HAS_ARGS_
вызова макроса без использования запятой или других несоответствующих приемов. Я имею в виду
SOME_MACRO_F() //0
SOME_MACRO_F(234) //1
SOME_MACRO_F(123, 132) //1
//etc