Category: 18+

Category was added automatically. Read all entries about "18+".

...

Иногда хочется написать на C функцию, принимающую переменное число аргументов, то есть такую функцию, что её можно вызвать, передав один аргумент, два или десять, - в момент написания функции заранее неизвестно. В таком случае можно воспользоваться стандартной конструкцией "..."; именно так работает printf(format, ...). Вместо многоточия при вызове передаются конкретные аргументы через запятую, которые затем доступны внутри функции один за одним. Конечно, придется ещё передать (или знать заранее) тип аргументов или там их число.
Есть любители передавать (указатель на) массив, но для вычисления среднего/максимального от двух-пяти чиселок огород с дополнительными массивами не алё.

пара примечаний:
0. По-английски конструкция с многоточием называется ellipsis (собственно, это и переводится как троеточие или опущение)
1. Стандартная работа с переданными аргументами ведётся через макросы из vararg.h; там же можно полюбоваться на встроенные макросы, которые в обычной жизни встречаются не слишком часто, типа __builtin_next_arg(xxx).
2. В C обязателен по крайней мере один аргумент перед многоточием; в c++0x можно обойтись без него (см. variadic templates).
3. Общего способа узнать число переданных аргументов нет (до прихода C99, по крайней мере); если, например, внутри функции читать аргументы через va_arg(xxx) "пока не сломается", то это приведет к случайной ошибке.
Пункты 2 и 3, таким образом, не позволяют написать какую-нибудь функцию max(...), она должна выглядеть как max(Nparam, ...).
Также здесь корни проблем от printf(format, xxx), когда та печатает мусор и/или стек вместе с чужими данными, - изнутри функции число и тип аргументов не виден, и приходится целиком полагаться на format.
4*. Понятно, что такая конструкция обязывает аккуратно работать с типами переданных аргументов, не трогать чужого на стеке и так далее.