Я бы посоветовал вам просто не использовать функции вариации.Однако они могут быть полезны.Например, в методах метапрограммирования шаблонов для реализации запросов во время компиляции.
- Поскольку компилятор не может проверить, что данный вызов функции с переменным числом аргументов передает соответствующее количество аргументов или что эти аргументы имеют соответствующие типы,Следовательно, вызов во время выполнения функции с переменными аргументами, которая передает неуместные аргументы, приводит к неопределенному поведению.
- В средах с чистым C альтернативные функции не имеют альтернативы, но в C ++ вы можете найти объектно-ориентированные альтернативы (также одна проблема).1008 *
- Функции Variadic не являются тривиальными для реализации.Если не инициализировать ap, вызов
va_arg()
один раз для многих или пропуск вызова va_end(ap)
может привести к сбою вашей программы.
Пример близкого к неопределенному поведению:
Моя работа заключалась в том, чтобы создать объектно-ориентированную оболочку вокруг sqlite C api.Я здесь: я создал необычный интерфейс для выполнения sqlite запросов, это было что-то вроде этого:
void Query(const std::string& Query, void* Arguments, ...);
Это с одной стороны удивительно и причудливо, но: вы сразу же сталкиваетесь с неопределенным поведением, если ваши типы параметров неверны.Например:
db->Query("select * from northwind where id = ?", "Peter"); // espects int as type
приведет к неопределенному поведению.