2013-04-13 5 views
4

Поскольку C не поддерживает перегрузку методов, как это возможно, чтобы иметь методы, как open, которые явно предлагает две различные сигнатуры:метод перегрузки в C

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

Я имею в виду, printf поддерживает варьировать число аргументов, используя vargs, но не имеют определенной подписи, отличной от той, которая используется vargs - в противном случае должна быть одна подпись for each possible printf. Тем не менее, open() - как я полагаю, - написан на C и предлагает две явные подписи.

Я действительно не реализовал эти функции. Может ли кто-нибудь показать небольшой пример того, как функционирует функция:

void foo() { printf("bar\n"); } 
void foo(int x) { printf("bar %d\n", x); } 

будет реализован в C?

+1

Я задавал подобный вопрос, прежде чем, пожалуйста, обратитесь к: [здесь] [1] [1]: http://stackoverflow.com/questions/3953895/why-does-man-2 -open-say-this –

+0

@GreenCode Я искал перегрузку метода, но ваш вопрос не отображался; вот почему я спросил. +1 Спасибо за ссылку. – Rubens

ответ

4

функция open определяется с переменным числом argume nts:

int open(const char *_path, int _oflag, ...) 

Адрес: <fcntl.h>; функция open объявлена ​​внизу с помощью макроса _PROTOTYPE.

Обратите внимание, что часть причины, по которой она работает с open, заключается в том, что функция уже принимает другие параметры. Чтобы функция принимала переменное количество аргументов, она должна принимать хотя бы один «фиксированный» аргумент. Вот почему это невозможно с помощью вашей функции foo().

+0

+1 Спасибо за объяснение. Теперь я полагаю, что функция 'open()', помимо принятия хотя бы одного аргумента, использует некоторое '' assert'ion 'для проверки времени неправильного количества параметров, правильно? – Rubens

+1

@Rubens Нет другой проверки времени компиляции, применяемой компилятором: она применяет стандартные действия к третьим аргументам (и любые другие аргументы, которые вы можете передать, потому что вызов 'open' с четырьмя или даже сорок, аргументы, возможно). Я предполагаю, что есть проверка выполнения во время выполнения, но компилятор очень ограничен тем, что он может проверить для аргументов за пределами '_oflag'. – dasblinkenlight

0

Вы не можете определить функцию с тем же именем более чем 1 раз в программе, как вы упомянули в своем вопросе

Использование макроса позволит определить функцию более чем 1 раз в коде C, но только 1 функция будет составлен

#ifdef MACRO1 
void foo() { printf("bar\n"); } 
#else 
void foo(int x) { printf("bar %d\n", x); } 
#endif 

и в главном

#ifdef MACRO1 
    foo(); 
#else 
    foo(5); 
#endif 
+1

Но может ли это позволить как первый, так и второй вызовы метода, как это делает функция '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' Я не уверен, но я предполагаю, что могу использовать оба вызова 'open()' в основном файле, не так ли? – Rubens

0

Это все варгары. В случае open он только считывает третий аргумент для определенных входов и состояний. В частности, когда он должен создать файл. Аналогично, printf считывает только аргументы при просмотре маркеров формата%. Ваш случай на самом деле не работает таким образом, поскольку нет раннего аргумента, указывающего, сколько аргументов существует.

1

Вы выбрали плохой справочник (http://linux.die.net), чтобы узнать об этой функции. Лучше всего Open Group Base Specifications. И это показывает, что это заявление для open():

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

Итак, другими словами, это просто переменной длины.

+0

+1 Спасибо за ссылку (: – Rubens

1

как можно иметь такие методы, как открыто, что явно предлагает две подписи:

Подождите, подождите, подождите ... Нах. Даже не близко.How'bout reading the documentation?

open() является VARIADIC функция, ее подпись

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

Нет магии здесь.

+0

на некоторых дистрибутивах 'man 2 open' дает документацию с этими сигнатурами: int open (const char * pathname, int flags); int open (const char * pathname, int flags, mode_t), следовательно, путаница. – santileortiz

Смежные вопросы