我有一个我创建的库,

mylib.c:

#include <mylib.h>
int
testlib() {
    printf("Hello world\n");
    return (0);
}

mylib.h:

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

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

我的程序.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)

我的问题是,声明函数原型的正确方法是什么?

有帮助吗?

解决方案

在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, ,它是无关的,通常被省略。

其他提示

快速回答:改变 int testlib()int testlib(void) 指定该函数不带参数。

A 原型 根据定义,它是一个函数声明,指定函数参数的类型。

非原型函数声明,例如

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++ 支持 (void) 语法与 C 保持一致。但除非您特别需要将代码编译为 C 和 C++,否则您应该使用 () 在 C++ 中和 (void) C 中的语法。)

尝试:

extern int testlib(void);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top