Я нашел функции перегрузки в справочной странице Linux - PullRequest
0 голосов
/ 01 февраля 2019

Когда я открываю 2 человека, я получаю ниже:

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

   int creat(const char *pathname, mode_t mode);

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

Это очень похоже на перегрузку функции.Но говорят, что C вообще не поддерживает перегрузку функций.Так в чем же здесь магия?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Чтобы увидеть фактическое определение этих функций, выполните следующую команду:

echo "#include <stdio.h>" | gcc -E - | grep -C5 "open"

Это предварительно обработает одну строку исходного кода и сообщит вам, что происходит под капотом.

результат должен выглядеть примерно так:

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

Это типичная функция varargs, например printf, но вы, как программист, должны передавать только один аргумент типа mode_t или вообще ничего.

0 голосов
/ 01 февраля 2019

Эти функции на самом деле не являются множественными функциями, это просто одна переменная функция , принимающая переменные аргументы , которая допускает «перегрузку» в том смысле, что вы можете вызывать их с помощью илибез их окончательного аргумента.Например, фактическое объявление openat в моей системе (без тегов атрибутов и т. П.):

extern int openat (int __fd, const char *__file, int __oflag, ...);

Этот окончательный ... означает, что он может принимать дополнительные аргументы через переменную stdarg.hAPI аргументов (va_start / va_arg / va_end).

...