Подтвердить что ты не робот

Почему "человек 2 открыт" говорит, что есть два вида открытых?

Я столкнулся с этим вопросом, набрав man 2 open. В нем говорится, что есть два вида открытых, один с двумя аргументами и один с тремя! в прошлый раз, когда я проверял, мы не могли перегружать функции в C. Как они это сделали? они пишут на С++?

int open(const char * pathname, int flags);
int open(const char * pathname, int flags, mode_t mode);
4b9b3361

Ответ 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. Любые дополнительные аргументы, которые функция "не хочет", фактически отбрасываются.