原因这计划不编译是因为编译器读取文件顺序。当它到达函数调用add()在main(),它不知道什么是补充的是,因为我们还没有定义add()以后!产生的误差在10线。然后,当到达add()实际的宣言,它抱怨将被重新定义(这似乎有些误导,因为它不会永远放在第一位的定义)。通常,代码中的一个错误会产生多个警告。
规则:当寻址的编译错误,在你的程序中,总是解决第一误差产生的第一个。
在这种情况下,这意味着我们需要解决的事实,编译器不知道添加。有三种方法来解决这个问题。
第一种方式是订购我们的函数调用将被定义在主:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include <iostream>
int
add(
int
x,
int
y)
{
return
x + y;
}
int
main()
{
using
namespace
std;
cout <<
"The sum of 3 and 4 is: "
<< add(3, 4) << endl;
return
0;
}
|
这样,当main()电话add(),它将已经知道添加。由于这是一个简单的程序,这种变化是比较容易做到的。然而,在一个大的程序,这将是非常乏味的试图破译功能称为其他功能可以在正确的顺序声明。
此外,这个选项是不可用。让我们说,我们写了一个,有两个功能,如果函数调用函数B计划,和功能的B细胞功能,那么有没有办法秩序的一种方式,他们都会很高兴的功能。如果你定义了一个第一,编译器会抱怨不知道B。如果你定义了B第一,编译器会抱怨说,它不知道什么是。
因此,一个更好的解决方案是使用一个前向声明。在向前声明,我们声明(但不定义)我们提前在这里我们使用它的功能,通常在文件的顶部。这样,编译器会明白我们的功能看起来像它遇到一个打电话的时候,它。我们通过书面声明语句称为函数的原型。函数原型是一个函数,包括函数名,参数和返回类型声明,,但没有实现的功能。
这是我们最初的计划向前声明:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <iostream>
int
add(
int
x,
int
y);
// forward declaration of add() using a function prototype
int
main()
{
using
namespace
std;
cout <<
"The sum of 3 and 4 is: "
<< add(3, 4) << endl;
return
0;
}
int
add(
int
x,
int
y)
{
return
x + y;
}
|
然而,我们喜欢的方法,其中的参数是因为它是描述性的读者命名。
一个问题,许多新的程序员都是:如果我们向前声明一个函数但不确定它会发生什么?
答案是:这取决于。如果一个前锋声明,但功能没有被调用,程序将编译和运行良好。然而,如果一个向前声明,函数被调用,但没有定义的功能的程序,程序将编译好的,但链接器会抱怨说,它不能解决函数调用。考虑下面的程序: