函数声明不是原型

时间: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'。

如果我们有一个变量aextern int a;可以告诉编译器a是一个可能存在于其他翻译单元中的符号(C编译器代表源文件),请不要解决直到链接时间。另一方面,作为函数名称的符号无论如何都在链接时解析。函数(" extern"," static")上的存储类说明符的含义仅影响其可见性,而" extern"是默认值,因此" extern"实际上是不必要的。

我建议删除extern,它是多余的,通常被省略。