我为什么要在C中声明一个函数?

时间:2015-11-22 16:17:36

标签: c function

我有两个源文件test1.ctest2.c

test1.c

#include <stdio.h>

void main() {
    checks(); }

test2.c

#include <stdio.h>

void checks(){
    printf("This is a sample Text");
    }

在这种情况下,我可以成功构建并运行该程序。

那我为什么要用:

void checks();

申报功能?

现在看起来非常好。

我正在使用C99。

1 个答案:

答案 0 :(得分:2)

在您的情况下,check()函数有一个非常简单的原型,C编译器应用的默认原型是接受任何作为参数并返回int。这可能是在这里完成的(除了因为你没有存储函数的结果,它被优化而没有注意到它)。

如果你想检查我的理论,试着写一下(它应该有效,直到它到达链接阶段):

int result = check();

最后,您的代码可以正常工作,因为链接器最终找到了可以插入check()函数的东西(但是,在某些时候它应该仍然需要int)。

事实上,函数原型的声明仅在两种情况下有用:

  1. 函数的代码和函数的使用在同一个文件中。

    当您在声明之前使用该函数(代码源)时,您需要告诉编译器在尝试静态键入您正在编写的函数时会发生什么(编译器从上到下读取源代码文件)。

    例如:

    int bar (int a, int b, bool c);
    
    int foo (int a, bool b) {
        int result = bar (a, a, c);
        ...
    }
    
    int bar (int a, int b, bool c) {
        ...
     }
    
  2. 使用该功能的函数代码不在同一个文件中。

    然后,您通常通过头文件获取函数的定义,该文件收集编译器所需的所有信息,以了解如何静态键入代码。头文件(*.h)包含您正在使用的模块的所有函数原型。函数的实现将在链接时间之后进行。

  3. 请注意,我通常会尝试避免第一种情况,因为它确实不合逻辑。当您阅读源代码时,就像编译器一样,从上到下进行,并且您希望在使用之前找到函数定义...因此,以一种方式构造代码更合​​乎逻辑不需要这样的工件。以我的拙见......