📜  在C中声明函数之前调用函数会发生什么?(1)

📅  最后修改于: 2023-12-03 15:07:52.770000             🧑  作者: Mango

在C中声明函数之前调用函数会发生什么?

在C语言中,函数通常需要在调用之前先进行声明。这是因为C语言的编译器是单遍的,每次只会对一个文件进行编译。如果在调用函数之前没有进行声明,编译器就无法知道函数的存在,也就无法对其进行正确的解析和编译。

那么,如果在C中声明函数之前调用函数会发生什么呢?

问题描述

考虑以下代码片段:

#include <stdio.h>

int main() {
    print_hello();
    return 0;
}

void print_hello() {
    printf("Hello world!\n");
}

这里的 main() 函数调用了 print_hello() 函数,但是在调用之前并没有对该函数进行声明。

报错信息

在编译以上代码时,编译器会输出以下错误信息:

test.c: In function ‘main’:
test.c:4:5: warning: implicit declaration of function ‘print_hello’ [-Wimplicit-function-declaration]
     print_hello();

这个错误信息告诉我们,当前文件中存在一个隐式声明的 print_hello() 函数,而这个函数的返回类型和参数类型都是未知的。

隐式声明与默认返回类型

在C语言中,如果在函数声明之前调用函数,编译器就会自动进行隐式声明。这个隐式声明包含函数名称和参数列表,但是不包含返回类型。

当编译器无法找到函数的声明时,会默认将函数的返回类型设置为 int

因此,在上面的代码片段中,编译器隐式声明了一个 print_hello() 函数,其返回类型为 int

解决方法

为了避免这个问题,我们应该在调用函数之前进行函数声明。

在C语言中,函数声明可以通过以下两种方式来进行:

  1. 在调用函数的文件中,在函数定义之前加上函数声明。
    void print_hello();
    
  2. 在头文件中定义函数声明,然后在需要调用函数的文件中包含头文件。
    // 文件 print_hello.h
    void print_hello();
    
    // 文件 main.c
    #include "print_hello.h"
    

无论是哪种方式,都能够告诉编译器函数的返回类型和参数类型,避免发生隐式声明和默认返回类型的问题。

总结

在C语言中,在声明函数之前调用函数会导致编译错误。这是因为编译器会自动进行隐式声明,但是隐式声明不包含返回类型,在默认返回类型为 int 的情况下容易出现错误。

为了避免这个问题,我们应该在调用函数之前进行函数声明。函数声明可以通过在调用函数的文件或头文件中添加声明来实现。