2

我正在尝试一点 C。我以为我已经理解了这个链接业务。但我想不会。我有一个简单的文件 main.c:

#include "function.h"
int main(char args[])
{
    int print = myfunction();
}

然后是第二对文件 function.c/function.h

int myfunction(); //function.h

int myfunction()  //function.c
{
    return 5;
}

编译这个效果很好。但是,无论我是否#include "function.h"在我的主文件中使用,它都很好用。那为什么我需要包含 function.h 呢?

4

5 回答 5

3

我不知道你在什么系统上,但如果它使用 gcc 或兼容的东西,请再试一次

cc -Wall -Werror *.c

或者,为您的系统打开等效选项。

大型程序总是以这种方式构建,以便编译器检查参数类型。与动态和脚本语言不同,C 生成实际的机器代码并且在运行时不检查参数计数或兼容性。

因此,函数原型被添加到基础语言中,以便在编译时进行类型检查。它们是可选的。

于 2010-11-01T17:09:46.313 回答
2

AC 编译器不要求您在使用函数1之前指定其原型。原型只是让编译器验证您传递的参数的类型是否与函数所需的类型相匹配——如果不正确,则隐式转换为正确的类型,并且存在隐式转换从/到所涉及的类型。

只要您的代码是完美的,并且您使用函数的方式与预期使用该函数的方式之间没有不匹配,您就不会有问题。在您的测试中,您有一个不带参数并返回一个 int 的函数,而使用它的代码基本上什么都不做。这种情况很难搞砸,而且效果很好。在具有成百上千个函数的实际程序中,采用复杂类型的多个参数等,情况变化很快。让编译器确保您正确调用函数变得更加重要。

1除可变参数函数外,即使存在“可变”参数,也基本上遵循相同的规则,就好像该函数没有原型一样。

于 2010-11-01T17:13:26.553 回答
1

当您使用尚未定义的函数时,许多 C 编译器只会假定它是一个返回 int 的 extern 函数(您经常会收到警告,但代码会编译。)您在开始使用函数时会遇到问题但是,具有更复杂的参数和返回类型。

于 2010-11-01T17:14:45.773 回答
0

您在头文件中声明一个函数以在不同的模块中使用它。您不一定需要源代码。您可以链接到二进制库。在编译期间,您需要声明用于检查参数、类型等的方法。

在您的简单示例中,这不是必需的。

于 2010-11-01T17:08:58.363 回答
0

如果您使用尚未声明的函数,较旧的 C 编译器将假定它具有参数...和返回类型int。不建议这样做。如果您打开编译器警告,您可能会收到有关使用未声明函数的警告。如果编译器在编译 main.c 之前看到 function.h,则编译器可以捕获更多错误,因此它确切知道myfunction应该如何操作。

于 2010-11-01T17:09:59.953 回答