О перегрузке функции в c - PullRequest
4 голосов
/ 03 ноября 2019

Я читаю справочную страницу системного вызова open () и заметил, что в справочной странице есть 2 типа функций:

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

Я знаю, что в C нетФункция перегрузки. Как может быть 2 объявления open ()? Спасибо!

1 Ответ

10 голосов
/ 03 ноября 2019

open фактически объявлено как переменная функция . Если вы заглянете в <fcntl.h>, то увидите что-то вроде

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

Так что в отношении синтаксиса любые аргументы после первых двух являются необязательными.

Объявления в manстраница предназначена для того, чтобы сообщить вам, что для того, чтобы функция действительно работала правильно, вы должны передать либо никаких дополнительных аргументов, либо один дополнительный аргумент типа mode_t. (Остальная часть справочной страницы объясняет, как определить, когда и что делать.)

Вы совершенно правы, что в C нет перегрузки функций, и на самом деле функция open фактически не знает, сколькоаргументы вы назвали это. Вместо этого * он проверяет, установлен ли бит O_CREAT в аргументе flags, и, если он есть, он знает, что должен быть третий аргумент, сообщающий ему, какие режимы должен иметь только что созданный файл. Затем он может получить значение этого аргумента, используя va_arg и друзей (или другим системным способом). Конечно, если вы укажете O_CREAT, но на самом деле не передадите третий аргумент или не передадите аргумент другого типа, чем mode_t, компилятор не остановит вас, но что-то, возможно, пойдет не так, когда функция будет выполнена.

* Могут быть и другие условия, при которых ожидается третий аргумент, например, при использовании флага O_TMPFILE, но O_CREAT является наиболее распространенным.

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