Почему "человек 2 открыт" говорит, что есть два вида открытых?
Я столкнулся с этим вопросом, набрав man 2 open
. В нем говорится, что есть два вида открытых, один с двумя аргументами и один с тремя! в прошлый раз, когда я проверял, мы не могли перегружать функции в C. Как они это сделали? они пишут на С++?
int open(const char * pathname, int flags);
int open(const char * pathname, int flags, mode_t mode);
Ответы
Ответ 1
Нет, они просто использовали вариационную функцию.
int open(const char * pathname, int flags, ...);
Это делает последний аргумент mode
опционным. Прототипы показывают, как использовать эту функцию, а не фактический интерфейс.
Конечно, в отличие от реальной перегрузки, компилятор не может проверить тип аргумента mode
, поэтому пользователь должен быть особенно осторожным, чтобы обеспечить передачу только 2 или 3 аргументов, а третий аргумент должен быть mode_t
.
BTW, если вы проверите man 2 open
для BSD (включая OS X), он показывает правильный прототип, как указано выше.
Ответ 2
Для чего это стоит, страница руководства неверна. Прототипы, которые он показывает:
int open(const char * pathname, int flags);
int open(const char * pathname, int flags, mode_t mode);
не эквивалентны правильному прототипу:
int open(const char * pathname, int flags, ...);
Используя неправильные, которые он предоставляет (например, если вы прототип функции самостоятельно, а не включая правый заголовок), ваша программа будет иметь поведение undefined. (И это не просто теоретически, но, вероятно, не будет работать на x86_64 и других платформах с байтовыми регистрами ABI.)
То, что была написано на странице man (и делает очень плохое задание), состоит в том, что вариационная часть списка аргументов open
может быть либо пустой, либо одиночным аргументом типа mode_t
, где отсутствие или наличие необязательный аргумент зависит от значения flags
.
Ответ 3
Нет, они писали в C, используя varargs.
Посмотрите stdarg.h, где есть примеры.
Парадигматическая функция может считывать столько аргументов, сколько ей нравится, из ellipsis. Любые дополнительные аргументы, которые функция "не хочет", фактически отбрасываются.