Почему «человек 2 открывает» говорит, что есть два типа открытия?

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

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

person Amir Zadeh    schedule 17.10.2010    source источник


Ответы (3)


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

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

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

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


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

person kennytm    schedule 17.10.2010
comment
Если компилятор знает о POSIX или знает о типах аргументов функции через какое-то расширение языка, он может выполнить проверку. Если gcc/glibc еще не делают этого, я не удивлюсь, если они скоро добавят его, точно так же, как проверяет аргумент printf. - person R.. GitHub STOP HELPING ICE; 17.10.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 с передачей по регистру.)

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

person R.. GitHub STOP HELPING ICE    schedule 17.10.2010

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

Ознакомьтесь с stdarg.h, где есть примеры.

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

person Prof. Falken    schedule 17.10.2010