如果我这样做: 的练习1:
#include <iostream>
int main()
{
//try to call doSomething function
doSomething();
}
void doSomething()
{
std::cout << "Call me now!" << std::endl;
}
我收到编译错误!因为编译不知道什么是“doSomething”。
但是如果我将doSomething的位置改为第一位,程序就会成功编译。 的练习2:
#include <iostream>
void doSomething()
{
std::cout << "Call me now!" << std::endl;
}
int main()
{
//try to call doSomething function
doSomething();
}
我可以声明原型是这样的: 的实例3:
#include <iostream>
void doSomething(void);
int main()
{
//try to call doSomething function
doSomething();
}
void doSomething()
{
std::cout << "Call me now!" << std::endl;
}
但为什么第一个例子不起作用?为什么我甚至必须先声明一个原型或首先调用函数和main函数?
谢谢!
答案 0 :(得分:6)
如果编译器没有看到定义或声明,就不能调用函数,首先 - 简单。在调用之前必须出现原型或实际定义。
答案 1 :(得分:1)
因为编译器在使用之前没有看过doSomething。
要么必须对其进行原型设计,要么首先对其进行定义,以便编译器知道如何分析它的用法。
答案 2 :(得分:1)
这是来自C的遗产.C是单通道语言,这意味着它必须通过仅读取一次文件来完成所有操作。为了能够在没有前向声明/原型的情况下调用函数,需要两次读取文件;第一次找到所有的功能签名,第二次实际编译。
C ++对作为C一部分的功能保留了这一要求,例如自由函数和全局变量。然而,类是C ++的新手,并且没有必要保持旧的做事方式。因此,在单个类定义中,使用多次通过编译。这就是你可以这样做的原因:
class MyClass {
void foo() {bar();}
void bar() {}
};
但你不能做你在问题中列出的内容。