📅  最后修改于: 2023-12-03 15:25:42.076000             🧑  作者: Mango
在 C++ 中,我们可以进行函数的前置声明或者函数原型的声明,从而在调用函数时避免出现未声明的情况。但是,如果我们没有进行声明或者原型的声明,是否还能够调用未声明的函数呢?
在 C++ 中我们可以尝试着去调用一个未声明的函数。例如:
#include <iostream>
int main(){
printHello(); //未声明的函数
return 0;
}
在这个例子中,我们尝试去调用一个名为 printHello()
的函数,但是我们并没有进行声明或者原型的声明。
当我们尝试这样做时,会出现以下两种情况:
如果未声明的函数存在于当前文件的后面,那么编译器会默认该函数的返回值类型是 int
,并生成相应代码。例如:
#include <iostream>
int main(){
printHello(); //未声明的函数
return 0;
}
void printHello(){
std::cout<<"Hello World!"<<std::endl;
}
当编译器遇到 printHello()
函数的定义时,会生成相应的代码。但是,这种情况也只是运气好,如果 printHello()
函数中调用了当前文件上面的某个函数,则会出现编译错误。
如果未声明的函数不存在于当前文件后面,则编译器会报错,提示未找到该函数的声明。例如:
#include <iostream>
int main(){
printHello(); //未声明的函数
return 0;
}
当编译器没有找到 printHello()
函数的声明时,会报出以下错误:
error: ‘printHello’ was not declared in this scope
printHello();
^~~~~~~~~~
并且,如果我们在另一个文件中定义了 printHello()
函数,则在编译错误中也无法找到相应的信息。
为了避免在使用函数之前未声明,在 C++ 中我们可以进行以下两种方式的声明:
前置声明
在调用函数之前,我们可以加上函数的前置声明,例如:
#include <iostream>
void printHello(); //函数的前置声明
int main(){
printHello();
return 0;
}
void printHello(){
std::cout<<"Hello World!"<<std::endl;
}
在这个例子中,我们在 main()
函数前面声明了函数 printHello()
,并且在函数定义之前调用,这样就可以避免调用未声明的函数产生的编译错误。
函数原型的声明
在头文件中,我们可以加入函数原型的声明,例如:
// 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++ 中良好的编码习惯之一。