Итак, я посмотрел на ваш вопрос, посмотрел на ваш код и понял, что это, вероятно, случай печально известной проблемы XY .
Хотя вы говорите, что хотите подсчитать количество аргументов, передаваемых макросу, вам нужно написать отладочные сообщения, которые не имеют никаких других параметров, кроме литеральной строки, в которой указаносообщение отладки, как показано в примере.
DEBUG(handler, DEBUG, "test");
Но это, конечно, возможно.И чтобы проверить это, я написал следующий фрагмент кода:
std::string format(const char* fmt, ...) {
char buffer[256];
std::cout << __FUNCTION__ << std::endl;
va_list argList;
va_start(argList, fmt);
vsprintf(buffer, fmt, argList);
va_end(argList);
return std::string(buffer);
}
#define TRC(...) {\
std::cout << "MACRO!" << std::endl; \
std::cout << format(__VA_ARGS__);\
}
int main()
{
std::cout << "Hello World!" << std::endl;
const char *t = "b";
TRC("[%s] bla bla [%d]\n", t, 9);
TRC("test");
return 0;
}
, который производит вывод,
Hello World!
МАКРО!
формат
[b] бла бла [9]
MACRO!
формат
тест
Как я уже упоминал в комментариях к вашему вопросу, у меня есть C++03
компилятор, но это должно работать и для C ++ 98, я думаю.
Вопрос:
«Как я могу проверить, есть ли только один аргумент или более одного?»
У самого макроса variadic нет проблем, есть ли у вас один аргумент или более.
Но если вы действительно хотите посчитать количество переданных аргументов, я не знаю, как это сделать в C++03
или ранее.