📜  我们可以在 C++ 中调用未声明的函数吗?(1)

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

在 C++ 中调用未声明的函数

在 C++ 中,我们可以进行函数的前置声明或者函数原型的声明,从而在调用函数时避免出现未声明的情况。但是,如果我们没有进行声明或者原型的声明,是否还能够调用未声明的函数呢?

未声明函数的调用

在 C++ 中我们可以尝试着去调用一个未声明的函数。例如:

#include <iostream>

int main(){
    printHello(); //未声明的函数
    return 0;
}

在这个例子中,我们尝试去调用一个名为 printHello() 的函数,但是我们并没有进行声明或者原型的声明。

当我们尝试这样做时,会出现以下两种情况:

  1. 如果未声明的函数存在于当前文件的后面,那么编译器会默认该函数的返回值类型是 int,并生成相应代码。例如:

    #include <iostream>
    
    int main(){
        printHello(); //未声明的函数
        return 0;
    }
    
    void printHello(){
        std::cout<<"Hello World!"<<std::endl;
    }
    

    当编译器遇到 printHello() 函数的定义时,会生成相应的代码。但是,这种情况也只是运气好,如果 printHello() 函数中调用了当前文件上面的某个函数,则会出现编译错误。

  2. 如果未声明的函数不存在于当前文件后面,则编译器会报错,提示未找到该函数的声明。例如:

    #include <iostream>
    
    int main(){
        printHello(); //未声明的函数
        return 0;
    }
    

    当编译器没有找到 printHello() 函数的声明时,会报出以下错误:

    error: ‘printHello’ was not declared in this scope
         printHello();
         ^~~~~~~~~~
    

    并且,如果我们在另一个文件中定义了 printHello() 函数,则在编译错误中也无法找到相应的信息。

如何避免在使用函数之前未声明?

为了避免在使用函数之前未声明,在 C++ 中我们可以进行以下两种方式的声明:

  1. 前置声明

    在调用函数之前,我们可以加上函数的前置声明,例如:

    #include <iostream>
    
    void printHello(); //函数的前置声明
    
    int main(){
        printHello();
        return 0;
    }
    
    void printHello(){
        std::cout<<"Hello World!"<<std::endl;
    }
    

    在这个例子中,我们在 main() 函数前面声明了函数 printHello(),并且在函数定义之前调用,这样就可以避免调用未声明的函数产生的编译错误。

  2. 函数原型的声明

    在头文件中,我们可以加入函数原型的声明,例如:

    // header.h
    #include <iostream>
    
    void printHello(); //函数原型的声明
    
    // implementation.cpp
    #include "header.h"
    
    int main(){
        printHello();
        return 0;
    }
    
    void printHello(){
        std::cout<<"Hello World!"<<std::endl;
    }
    

    在这个例子中,我们将函数 printHello() 的原型声明放在头文件中,在需要使用该函数的地方,只需 #include 头文件,就可以避免调用未声明的函数产生的编译错误。

总结

尽管 C++ 中可以在不声明的情况下调用函数,但是为了避免编译错误和不易出错的代码,我们还是应该进行函数的前置声明或者函数原型的声明。同时,在头文件中加入函数原型的声明也是 C++ 中良好的编码习惯之一。