最近,我的一些CPP教程使用了函数原型。我知道你必须初始化这个功能,但它的整体用途是什么?难道你不能在main()之前编写整个函数而不是定义原型吗?
int returnValue(void);
int main()
{
std::cout << returnValue() << std::endl;
return 0;
}
int returnValue(void)
{
return 10;
}
答案 0 :(得分:1)
难道你不能在main()之前编写整个函数而不是定义原型吗?
我可以想到以下情况,你不能。
多个文件中使用的功能
如果在多个源(.cpp)文件中使用了某个函数,则只能在一个源文件中定义该函数。您必须在剩余的源文件中声明它。为方便起见并避免错误,此类声明将放在头文件中。然后,源文件的头文件为#include
。
相互递归函数
如果foo
调用bar
和bar
调用foo
,则无法在未提供至少一个函数声明的情况下实现它们。
作为一种良好实践,最好先声明两种功能。然后你可以按任何顺序实现它们。
答案 1 :(得分:0)
一个重要的用例是将实现与声明分开。换句话说,您在头文件中声明您的函数/类等,并在cpp文件中定义(即实现)它们。通过这种方式,您可以使用在共享库或静态库中完全编译的实现来分发程序。要使用预编译功能,您需要通过声明将其介绍给您的程序。例如:
<强> A.H 强>
void f();
<强> a.cpp 强>
void f(){/* implementation here */}
<强>的main.cpp 强>
#include "a.h"
int main()
{
f();
}
在"a.h"
中加入main()
即表示该功能。编译a.cpp
一次后,您不再需要它的源代码,只要您至少可以访问目标文件,程序就会运行,但为了让链接器找到函数{{1}你需要声明它。
答案 2 :(得分:0)
如果没有指定函数原型,则行为特定于编译器实现的C标准(C90或C99)。高达C90标准,C编译器假定省略的函数原型的返回类型为int。编译器方面的这种假设可能导致未指定的程序行为。
后来的C99标准规定编译器不能再将返回类型假设为int。因此,C99在功能原型的类型检查中变得更加受限制。但是为了使C99标准向后兼容,在实践中,编译器抛出警告说返回类型假定为int。但他们继续编译。因此,程序员有责任确保假定的函数原型和实际的函数类型匹配。
为了避免C标准的所有这些实现细节,最好有函数原型。