Если вы используете функцию с переменным числом, вам нужно каким-то образом сообщить функции, сколько аргументов было передано.Например, printf()
и друзья получают строку форматирования, которая содержит спецификаторы формата для каждого из переданных аргументов, и подсчитывают количество спецификаторов формата, чтобы определить, сколько аргументов было передано.
При передаче спискауказатели, вы можете сделать это «проще», передав нулевой указатель в качестве последнего аргумента.Таким образом, вы просто читаете аргументы, пока не достигнете нулевого указателя.
Однако , вы должны серьезно рассмотреть , а не , используя для этого переменную функцию.Вы можете выполнить то же поведение, взяв вектор указателей в качестве параметра и перебирая содержимое этого вектора.Существует несколько причин, по которым это лучше, чем использование функции с переменными числами:
Функции с переменными числами не имеют абсолютно никакой безопасности типов.Вы теряете всю информацию о типах аргументов, когда передаете их в функцию с переменным числом, поэтому, например, вызывающая сторона вашей функции может передать числовое значение вместо указателя, и вы никогда не сможете узнать внутри своей функции.
При использовании вариадического решения вызывающая сторона должна правильно указать количество аргументов.Если вызывающая сторона пропускает нулевой указатель в конце (или иным образом дезинформирует вашу функцию относительно количества имеющихся аргументов), и вы пытаетесь прочитать больше аргументов, чем было передано, вы получите неопределенное поведение.Прямо сейчас вы можете сказать: «Ну, это не трудно забыть», но неизбежно, кто-то забудет или облажается, и отладка такого рода проблем - это избиение.
Решение, принимающеевектор и итерации по его содержимому гораздо проще реализовать, легче отлаживать и намного более идиоматичны в C ++.
Везде, где есть выбор между использованием функции с переменными числами и отсутствием использованияvariadic function, вы должны предпочесть не использовать variadic function (допустим, я никогда не писал variadic-функции ни в одном из написанного мною кода C ++, хотя я написал несколько в C).