Почему «человек 2 открытый» говорит, что есть два вида открытых? - PullRequest
16 голосов
/ 17 октября 2010

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

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

Ответы [ 3 ]

19 голосов
/ 17 октября 2010

Нет, они просто использовали переменную функцию.

int open(const char * pathname, int flags, ...);

Это делает последний аргумент mode необязательным.Прототипы показывают только то, как должна использоваться функция, а не фактический интерфейс.

Конечно, в отличие от реальной перегрузки, компилятор не может проверить тип аргумента mode, поэтому пользователь должен быть особенно осторожен субедитесь, что передано только 2 или 3 аргумента, а третий аргумент должен быть mode_t.


Кстати, если вы проверяете man 2 open для BSD (включая OS X), он показывает правильный прототип, как указано выше .

8 голосов
/ 17 октября 2010

Как бы то ни было, страница справочника неверна.Прототипы, которые он показывает:

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

не эквивалентны правильному прототипу:

int open(const char * pathname, int flags, ...);

Использование неправильных протоколов, которые он предоставляет (например, если вы создаете прототипвместо правильного заголовка) ваша программа будет иметь неопределенное поведение.(И это не просто теоретически; вероятно, он не сможет работать на x86_64 и других платформах с ABI с проходным регистром.)

То, что man-страница пыталась выразить (и делает очень плохую работу) заключается в том, что переменная часть списка аргументов open может быть либо пустой, либо единственным аргументом типа mode_t, где отсутствие или наличие необязательного аргумента зависит от значения flags.

7 голосов
/ 17 октября 2010

Нет, они написали на C, используя varargs.

Проверьте stdarg.h , где есть примеры.

Функция variadic может читать столько аргументов, сколько ей нравится из многоточия . Любые дополнительные аргументы, которые функция «не хочет», фактически отбрасываются.

...