我在readdir_r的函数调用中因为参数不足而得到错误。 readdir_r的函数原型就像
int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
其中dirp - 目录流,条目是目录中的下一个条目,结果是返回项目的指针。
我使用readdir_r作为
int re = readdir_r( dir , &entry);
我是否需要将所有三个参数作为原型传递才能使其工作?
答案 0 :(得分:1)
我是否需要将所有三个参数作为原型传递才能使其工作?
是的,你应该传递三个参数来工作。你已经声明函数应该需要三个参数。
例如
如果您将函数声明为int foo(char,int);
这里指定了参数数量及其类型。你应该使用相同数量的参数调用函数,并且应该以与函数声明中相同的顺序传递参数。
你应该调用上面的功能
int i=foo('a',1024);
您不应该调用上面的功能
int i=foo(10);
如果您将函数声明为int foo();
这里你没有指定参数的数量。然后,如果你传递不同数量的参数,就会忽略。
你可以像这样调用函数
int i=foo();
int i=foo(10);
int i=foo(10,20);
但是,这三个结果是一样的。在这些情况下,只是忽略参数。
声明一个不带参数并返回int的函数的好习惯是
int foo(void);
如果你想写一个带有可变数量参数的函数,请参见Variadic_function
答案 1 :(得分:1)
使用readdir_r()
等函数,需要使用 all 参数。
有时参数允许使用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)
仅告诉您返回类型。如果编码器做了正确的事情,编译器就无法弄清楚。这种风格早已失宠。