函数声明不是原型
时间:2020-03-05 18:47:08 来源:igfitidea点击:
我有一个我创建的图书馆
mylib.c:
#include <mylib.h> int testlib() { printf("Hello world\n"); return (0); }
mylib.h:
#include <stdio.h> extern int testlib();
在我的程序中,我尝试调用此库函数:
myprogram.c:
#include <mylib.h> int main (int argc, char *argv[]) { testlib(); return (0); }
当我尝试编译该程序时,出现以下错误:
In file included from myprogram.c:1 mylib.h:2 warning: function declaration isn't a prototype
我正在使用:gcc(GCC)3.4.5 20051201(Red Hat 3.4.5-2)
我的问题是,声明函数原型的正确方法是什么?
解决方案
回答
尝试:
extern int testlib(void);
回答
在C语言中,int foo()
和int foo(void)
是不同的功能。 int foo()
接受任意数量的参数,而int foo(void)
接受0个参数。在C ++中,它们含义相同。我建议我们在没有参数的情况下始终使用`void'。
如果我们有一个变量a
,extern int a;
可以告诉编译器a
是一个可能存在于其他翻译单元中的符号(C编译器代表源文件),请不要解决直到链接时间。另一方面,作为函数名称的符号无论如何都在链接时解析。函数(" extern"," static")上的存储类说明符的含义仅影响其可见性,而" extern"是默认值,因此" extern"实际上是不必要的。
我建议删除extern
,它是多余的,通常被省略。