为什么即使没有任何类声明也需要原型
Why prototype is required even without any class declaration?
如果我这样做: 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() {}
};
但是你不能做你在你的问题中列出的。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 函数向量_指针有不同的原型,我可以构建一个吗
- 声明原型时如何在主代码块中调用函数
- C++:在原型中声明"auto"函数返回类型仍然会导致在扣除错误之前使用"auto&quo
- 函数在类中声明时应该有一个原型
- 将数组传递到函数会在函数原型声明中出现错误
- 您只是调用前方声明和原型声明“声明”
- 在头文件中的函数原型中获取指针数组:函数声明为 void
- 为什么类声明排序对于原型仍然很重要
- 一个声明中多个函数的原型
- 编译器声明调用没有匹配的函数,即使原型中有一个
- C++对象创建或函数原型声明
- C++在头文件中声明函数原型时出错
- 应该在哪里声明函数原型
- 为什么模板类的显式方法专门化可以在类内部没有原型声明的情况下工作
- 为什么即使没有任何类声明也需要原型
- 内联函数原型vs正则声明vs原型
- 如何声明带有void *指针的c++原型,以便它可以接受任何指针类型
- 链表声明与原型不兼容
- C++:在匿名命名空间中声明函数原型的正确方法是什么