printf()
и друзья не являются особенными, потому что они принимают переменное число аргументов: пользовательские функции также могут принимать переменное количество аргументов. Они особенные, потому что их поведение определяется стандартом, поэтому компилятор знает, какая должна быть корреляция между строкой формата и аргументами, передаваемыми в функцию.
Фактически, компилятор знает, сколько аргументов передается функции, когда она вызывается, поэтому он анализирует строку формата и сравнивает ожидаемое число и типы аргументов с тем, какие аргументы фактически передаются в функцию, и выдает предупреждение, если они не совпадают.
Если вы используете C ++, я бы избегал написания ваших собственных функций с переменными числами; Есть несколько веских причин использовать их в большинстве проектов. Например, если вы выполняете форматирование, используйте потоки или библиотеку, например Boost Format . Любая проблема, которая может быть решена с помощью функции с переменными значениями, может быть решена с использованием функции без переменных величин, и почти во всех случаях результат является более элегантным, идиоматическим и безопасным для типов.