You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为何类内调用后续定义的函数无需前置声明?对比外部函数差异

为什么类内调用后续定义的函数无需前置声明,而全局函数需要?

先看你给出的两段代码:

Prog1

class A{
public:
    void test_a(){
        b();//No need for forward declaration
    }
    void b(){
        //Do something
    }
};

Prog2

void a();//forward declaration, else failure
int main(){
    a();
    return 0;
}
void a(){
    //Do something
}

这差异其实是C++编译器对类作用域全局作用域的处理规则不同导致的,我给你说透:

  • 类内部的“提前扫描”机制:编译器处理类的时候,会先做一个“预扫描”——把整个类里所有成员函数的声明、成员变量的定义全都先过一遍,存到自己的“符号表”里。等它处理test_a的函数体时,已经知道这个类里有个叫b的成员函数了,不管b的定义是在test_a前面还是后面,都不影响调用。简单说就是,类的作用域里,编译器是“先摸清所有成员底细,再处理函数实现”,所以完全不需要前置声明。

  • 全局作用域的“逐行解析”规则:但全局作用域就没这个待遇了,编译器是从上到下逐行解析代码的。当main里调用a()的时候,如果前面没有任何关于a的声明,编译器根本不知道a是什么——它不会提前跳去看后面的函数定义,所以必须加个void a();的前置声明,给编译器打个招呼“后面会有这个函数的实现,你先记着有这么个东西”,这样编译才能顺利通过。

总结一下就是:类的作用域有“完整扫描后处理”的特殊规则,而全局作用域是“顺序扫描、即时验证”,这就是两者差异的核心原因。

内容的提问来源于stack exchange,提问作者user11281305

火山引擎 最新活动