C “警告/错误”;函数声明是';“t原型”;
我创建了一个图书馆 文件mylib.c: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
#包括
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 */
}