为什么即使没有任何类声明也需要原型?

时间:2011-11-20 02:45:27

标签: c++ function-prototypes

如果我这样做: 的练习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函数?

谢谢!

3 个答案:

答案 0 :(得分:6)

如果编译器没有看到定义或声明,就不能调用函数,首先 - 简单。在调用之前必须出现原型或实际定义。

答案 1 :(得分:1)

因为编译器在使用之前没有看过doSomething。

要么必须对其进行原型设计,要么首先对其进行定义,以便编译器知道如何分析它的用法。

答案 2 :(得分:1)

这是来自C的遗产.C是单通道语言,这意味着它必须通过仅读取一次文件来完成所有操作。为了能够在没有前向声明/原型的情况下调用函数,需要两次读取文件;第一次找到所有的功能签名,第二次实际编译。

C ++对作为C一部分的功能保留了这一要求,例如自由函数和全局变量。然而,类是C ++的新手,并且没有必要保持旧的做事方式。因此,在单个类定义中,使用多次通过编译。这就是你可以这样做的原因:

class MyClass {
    void foo() {bar();}
    void bar() {}
};

但你不能做你在问题中列出的内容。