Что ... означает в списке аргументов в C? - PullRequest
32 голосов
/ 14 июля 2009

Я наткнулся на следующую сигнатуру функции и подумал, является ли это (многоточие или "...") полиморфизмом?

#include <fcntl.h>
int fcntl(int fd, int cmd, ... );

Заранее спасибо.

Ответы [ 14 ]

0 голосов
/ 14 июля 2009

Объявление printf в стандартной библиотеке:

int printf(const char*, ...); 

Подумайте об этом.

0 голосов
/ 14 июля 2009

C не поддерживает перегрузку функций - которая является типом специального полиморфизма , основанной на типах времени компиляции, - а также множественную диспетчеризацию (то есть перегрузку, основанную на типах времени выполнения).

Чтобы симулировать перегрузку функций в C, вам нужно создать несколько функций с разными именами. Имена функций часто содержат информацию о типе, например, fputc() для символов и fputs() для строк.

Множественная диспетчеризация может быть реализована с помощью переменных макросов. Опять же, задача программиста - предоставить информацию о типе, но на этот раз с помощью дополнительного аргумента, который будет оцениваться во время выполнения - в отличие от имени функции времени компиляции в случае подхода, описанного выше. Семейство функций printf() может быть не лучшим примером для множественной отправки, но сейчас я не могу придумать лучшего.

Существуют и другие подходы к множественной диспетчеризации с использованием указателей вместо функций с переменным значением или переноса значений в структурах для предоставления аннотаций типов.

0 голосов
/ 14 июля 2009

Технически это не полиморфизм. fcntl принимает переменное число аргументов, и это является причиной ... аналогично функции printf.

0 голосов
/ 14 июля 2009

Нет, это функция, которая принимает переменное число аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...