2013-10-12 4 views
-2

Я получаю ошибку как недостаточные аргументы в вызове функции readdir_r. Функция прототип readdir_r подобенНедостаточно аргументов в вызове функции

int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result); 

где DIRP - поток каталога, запись Следующая запись в каталоге, и результатом является указатель на возвращенный деталь.

Я использую readdir_r в

int re = readdir_r(dir , &entry); 

мне нужно пройти все три аргумента в качестве прототипа, чтобы заставить его работать ли?

+2

Да. Вам нужно передать все аргументы. Для третьего аргумента вы должны передать указатель туда, куда хотите вернуть возвращенные данные. – Baldrick

+0

вы должны передать все аргументы, но он все равно может скомпилироваться с двумя аргументами, если вы объявите прототип как int readdir_r(); .... – tristan

+0

Почему вы ожидаете, что функция будет работать правильно, если не будут указаны все аргументы? – chux

ответ

1

Должен ли я передать все три аргумента в качестве прототипа, чтобы заставить его работать?

Да, вы должны передать три параметра для работы. Как вы уже заявили, функция должна требовать три параметра.

Например

Если функция объявлена ​​как int foo(char,int);

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

Вы должны вызвать выше функции

int i=foo('a',1024); 

Вы не должны вызывать выше функции, как показано ниже

int i=foo(10); 

Если функция объявлена ​​как int foo();

Здесь Вы не указали количество аргументов. Тогда, если вы передадите другое количество аргументов si mply игнорирует.

вы можете вызвать функцию Понравился

int i=foo(); 

int i=foo(10);  

int i=foo(10,20); 

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


И хорошая практика объявления функции, которая не принимает никаких параметров и возвращает ИНТ

 int foo(void); 

, если вы хотите написать функцию, которая принимает переменное число аргументов см Variadic_function

+1

Пожалуйста, разверните на «... если вы передадите любое количество аргументов, просто игнорируете». Не совсем понятно, что вы подразумеваете. – chux

+0

@chux Expanded Мой ответ. спасибо за указание. – Gangadhar

+0

IMHO, объяснение 'int foo()' вводит в заблуждение. Компилятор не знает, как/какой тип должна получить функция, но функция передается _something_ и может легко предоставлять разные результаты между 'foo (10)' и 'foo (10,20)'. С такими функциями параметры не обязательно игнорируются. Если они не являются надлежащим числом, типом и значением, функция может быть ошибкой. – chux

1

с функциями, как readdir_r(), необходимо использовать все аргументы.

Иногда аргументы допускают значения, такие как NULL или 0, но это зависит от функции.

int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result); 

Функция с прототипом, который включает ..., как printf() позволяют переменное количество аргументов, начиная с .... Количество и тип, необходимые, опять же, зависят от функции. Правильный тип и число невозможно узнать компилятору (если только он не является стандартной библиотечной функцией).

int printf (const char * format, ...); 

Старые школьные прототипы/заявления как int foo() или int bar(a,b,c) только сказать вам тип возвращаемого значения. Компилятор не может понять много, если кодер поступил правильно. Этот стиль давно ушел из моды.

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