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

Why prototype is required even without any class declaration?

本文关键字:原型 声明 任何类 为什么      更新时间:2023-10-16

如果我这样做: Ex1:

#include <iostream>
int main()
{
    //try to call doSomething function
    doSomething();
}
void doSomething()
{
    std::cout << "Call me now!" << std::endl;
}

出现编译错误!因为编译器不知道"doSomething"是什么

但是,如果我将doSomething的位置更改到第一位,则程序编译成功。 Ex2:

#include <iostream>
void doSomething()
{
    std::cout << "Call me now!" << std::endl;
}
int main()
{
    //try to call doSomething function
    doSomething();
}

我可以这样声明prototype:要是

#include <iostream>
void doSomething(void);
int main()
{
    //try to call doSomething function
    doSomething();
}
void doSomething()
{
    std::cout << "Call me now!" << std::endl;
}

但是为什么第一个例子不起作用呢?为什么我甚至必须先声明一个原型或调用函数,最后调用主函数?

谢谢!

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

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

要么你必须原型化它,要么首先定义它,这样编译器就知道如何分析它的用法。

这是C语言遗留下来的。C是一种单遍语言,这意味着它只需要读取一次文件就可以完成所有工作。为了能够在没有前向声明/原型的情况下调用函数,需要读取文件两次;第一次查找所有函数签名,第二次实际编译。

c++保留了对C语言特性的这一要求,比如自由函数和全局变量。然而,类对于c++来说是新的,没有必要保持旧的做事方式。因此,在单个类定义中,将使用多通道编译。这就是为什么你可以这样做:

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

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