C “警告/错误”;函数声明是';“t原型”;

C “警告/错误”;函数声明是';“t原型”;,c,gcc,C,Gcc,我创建了一个图书馆 文件mylib.c: #包括 int testlib(){ printf(“你好,世界!\n”); 返回(0); } 文件mylib.h: #包括 extern int testlib(); 在我的程序中,我尝试调用此库函数: 文件myprogram.c: #包括 int main(int argc,char*argv[]){ testlib(); 返回(0); } 当我试图编译此程序时,出现以下错误: In file included from myprogram.c

我创建了一个图书馆

文件mylib.c:
#包括
int
testlib(){
printf(“你好,世界!\n”);
返回(0);
}
文件mylib.h:
#包括
extern int testlib();
在我的程序中,我尝试调用此库函数:

文件myprogram.c:
#包括
int
main(int argc,char*argv[]){
testlib();
返回(0);
}
当我试图编译此程序时,出现以下错误:

In file included from myprogram.c:1 mylib.h:2 warning: function declaration isn't a prototype 在myprogram.c中包含的文件中:1 h:2警告:函数声明不是原型 我正在使用:
gcc(gcc)3.4.5 20051201(Red Hat 3.4.5-2)

声明函数原型的正确方法是什么?

试试:

extern int testlib(void);
在C中,
intfoo()
intfoo(void)
是不同的函数
int foo()
接受任意数量的参数,而
int foo(void)
接受0个参数。在C++中,它们的意思是相同的。我建议在没有参数的情况下,一致使用
void

如果您有一个变量
a
extern int a
是一种告诉编译器
a
是可能存在于不同翻译单元中的符号的方法(C编译器代表源文件),在链接之前不要解析它。另一方面,作为函数名的符号无论如何都会在链接时解析。函数(
extern
static
)上存储类说明符的含义只影响其可见性,
extern
是默认值,因此实际上不需要
extern


我建议删除
外部
,它是无关的,通常会被忽略

快速回答:将
int-testlib()
更改为
int-testlib(void)
以指定函数不带参数

根据定义,原型是指定函数参数类型的函数声明

非原型函数声明,如

int foo();
是一种旧式声明,它不指定参数的数量或类型。(在1989年ANSI C标准之前,这是该语言中唯一可用的函数声明。)您可以使用任意数量的参数调用此类函数,并且编译器无需抱怨——但如果调用与定义不一致,则程序具有未定义的行为

对于接受一个或多个参数的函数,可以在声明中指定每个参数的类型:

int bar(int x, double y);
没有参数的函数是一种特殊情况。从逻辑上讲,空括号是指定函数不带参数的好方法,但这种语法已经用于旧式函数声明,因此ANSI C委员会使用
void
关键字发明了一种新语法:

int foo(void); /* foo takes no arguments */
函数定义(包括函数实际作用的代码)也提供声明。在您的情况下,您有一些类似于:

int testlib()
{
    /* code that implements testlib */
}
这为
testlib
提供了一个非原型声明。作为定义,它告诉编译器
testlib
没有参数,但作为声明,它只告诉编译器
testlib
接受一些未指定但固定数量和类型的参数

如果将
()
更改为
(void)
,则声明将成为原型

原型的优点是,如果您意外地使用一个或多个参数调用
testlib
,编译器将诊断错误


<>(C++)的规则略有不同。C++没有旧的函数声明,空括号特别地表示函数不带参数。C++支持与C一致性的<代码>(空隙)< />语法,但是除非你特别需要代码编译为C和AS C++,否则你应该使用<代码>()。 C++中的“<代码>(空隙)< /COD> C.语法”< /P>在MyLIB .h中声明声明中的EXTUN。特别是如果您编写纯C程序,则不需要外部声明。在C中使用<代码>(空隙)< /COD>来指示函数没有参数。在C++中,除非你特别需要你的代码来编译C和AS C++,只需使用<代码>()。天哪,事情搞清楚了。在“那是一场争论”附近似乎少了点什么。
int bar(int x, double y);
int foo(void); /* foo takes no arguments */
int testlib()
{
    /* code that implements testlib */
}