模块化编程和函数原型

时间:2015-05-23 16:49:49

标签: c c99

我正在这个(法国)网站上学习C:http://openclassrooms.com/courses/apprenez-a-programmer-en-c我在关于模块化编程的章节中说:

  

因为订单在这里具有真正的重要性:如果您将功能放在源代码中的main之前,那么您的计算机已经读取并知道它。当您打电话给该功能时,计算机将知道该功能并知道去哪里获得它。

     

但是,如果您将功能放在main之后,它将无法工作,因为计算机还不知道该功能。试试看吧!

我尝试将我的函数放在main函数之后,如下面的代码所示,但我的代码可以工作:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int nbE = 0;
    int nbM = 0;
    printf("Nombre a tripler : ");
    scanf("%d", &nbE);
    nbM = triple(nbE);
    printf("Le nombre triple de %d est %d", nbE, nbM);

    return 0;
}

int triple(int nb)
{
    return nb * 3;
}

你能解释一下它为什么会起作用吗?

4 个答案:

答案 0 :(得分:5)

这是因为编译器假定参数和返回值是int,它们是。如果您的函数返回float值,则无法正常工作。这就是使用函数原型的原因:声明函数(比如在头文件中),这样就可以正确使用它,而不需要构建此模块的编译器看到正文。正文可能位于另一个文件中,也可能位于库中。所以你应该

#include <stdio.h>
#include <stdlib.h>

int triple(int nb);      // <-- function prototype

int main(int argc, char *argv[]) { ...

位于程序的顶部。但是没有必要将整个函数放在main之前。

答案 1 :(得分:1)

您的代码可能是根据较旧的C标准编译的,该标准并不需要原型。相反,它假设它所看到的任何未声明的函数接受它传递的任何参数,并返回int

答案 2 :(得分:0)

如果您使用警告选项(-Wall)进行编译(您应该始终这样做),那么您将看到编译器通过为其创建隐式声明来猜测函数是否存在。

通常你不希望编译器猜测你的函数声明,因为它可能会弄错它们。保持安全,并提前声明您的功能。

答案 3 :(得分:-2)

程序不包含函数原型声明。 。 应该有一个:

int triple(int);