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
является наиболее распространенным.