Forward declarations(声明),c++声明的一些问题!

大家看这个例子:

#include <iostream>
 
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;
}

你希望这个程序产生的结果:
3和4的总和是:7
add.cpp(10) : error C3861: 'add': identifier not found
add.cpp(15) : error C2365: 'add' : redefinition; previous definition was 'formerly unknown identifier'

这个项目的原因并不是因为编译器编译顺序读取文件。当它到达函数调用add()内的主要(),它不知道添加,因为我们还没有定义添加(),直到后来,产生错误的。然后,当它到达实际申报的add(),它抱怨添加被重新定义(这似乎略微误导,因为它不会永远在第一时间定义)。很多时候,一个错误在你的代码最终会产生多个警告。
规则:当解决编译错误在程序中,总是解决第一个错误产生第一。
在这种情况下,这意味着我们需要解决这个事实,编译器不知道添加是。有三种方法可以解决这个问题。
第一个方法是再选择我们的函数调用之前定义所以添加主要:

#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。如果您定义B第一,编译器会抱怨它不知道什么是。
因此,一个更好的解决方案是使用一个前置声明。在一个前置声明,我们声明(但不要定义)我们的函数,我们之前使用它,通常在文件的顶部。这种方法,编译器将会明白我们的函数看起来像当遇到一个叫它之后。我们通过写一个声明语句称为函数原型。一个函数原型是一个函数的声明,包括函数的名称、参数和返回类型,但没有实现的功能。
这是我们的原始程序的前置声明:

#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值