原型化函数 - C ++

时间:2015-10-13 05:53:04

标签: c++ function function-prototypes

最近,我的一些CPP教程使用了函数原型。我知道你必须初始化这个功能,但它的整体用途是什么?难道你不能在main()之前编写整个函数而不是定义原型吗?

int returnValue(void);

int main()
{
  std::cout << returnValue() << std::endl;
  return 0;
}

int returnValue(void)
{
  return 10;
}

3 个答案:

答案 0 :(得分:1)

  

难道你不能在main()之前编写整个函数而不是定义原型吗?

我可以想到以下情况,你不能。

多个文件中使用的功能

如果在多个源(.cpp)文件中使用了某个函数,则只能在一个源文件中定义该函数。您必须在剩余的源文件中声明它。为方便起见并避免错误,此类声明将放在头文件中。然后,源文件的头文件为#include

相互递归函数

如果foo调用barbar调用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标准的所有这些实现细节,最好有函数原型。