...
означает, что вы можете передать любое количество аргументов этой функции, как уже упоминалось другими комментаторами. Поскольку необязательные аргументы не типизированы, компилятор не может проверять типы, и вы можете технически передать любой аргумент любого типа.
Значит ли это, что вы можете использовать это для реализации какой-то полиморфной функции? (То есть функция, которая выполняет некоторую операцию в зависимости от типа своих аргументов.)
номер
Причина, по которой вы не можете этого сделать, заключается в том, что вы не можете во время выполнения проверять типы передаваемых аргументов. Ожидается, что функция чтения из списка переменных аргументов уже знает типы необязательных аргументов, которые она собирается получить.
В случае, если функция, которая действительно должна принимать любое количество аргументов любого типа (то есть printf
), типы аргументов передаются через строку формата. Это означает, что вызывающая сторона должна указывать типы, которые она будет передавать при каждом вызове, устраняя преимущество полиморфных функций (что вызывающая сторона также не должна знать типы).
Сравните:
// Ideal invocation
x = multiply(number_a, number_b)
y = multiply(matrix_a, matrix_b)
// Standard C invocation
x = multiply_number(number_a, number_b)
y = multiply_matrix(matrix_a, matrix_b)
// Simulated "polymorphism" with varargs
x = multiply(T_NUMBER, number_a, number_b)
y = multiply(T_MATRIX, matrix_a, matrix_b)
Вы должны указать тип, прежде чем функция varargs сможет сделать правильную вещь, так что это ничего не даст вам.