警告/错误“函数声明不是原型”

我创建了一个图书馆,

文件 Mylib.c:

#include <mylib.h>


int
testlib() {
printf("Hello, World!\n");
return (0);
}

文件 返回文章页面

#include <stdio.h>
extern int testlib();

在我的程序中,我尝试调用这个库函数:

文件 我的程序:

#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)

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

185837 次浏览

试试:

extern int testlib(void);

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

如果你有一个变量 aextern int a;是一种告诉编译器 a是一个符号,可能存在于不同的翻译单元(C 编译器代表源文件) ,不要解决它,直到链接时间。另一方面,作为函数名的符号无论如何都要在链接时解析。函数(externstatic)上存储类说明符的含义只影响其可见性,而 extern是默认值,因此 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 保持一致的 (void)语法。但是,除非您特别需要将代码编译为 C 和 C + + ,否则可能应该使用 C + + 中的 ()和 C 中的 (void)语法)