欢迎光临散文网 会员登陆 & 注册

C++(5.5) const 和 static 成员

2023-04-05 16:23 作者:咸鱼暄  | 我要投稿

关于这条视频里


19:22


处在 Compiler Explorer 跑代码翻车的解释:

具体问题是,这段代码能编译通过,虽然 Foo::a 没有被定义:

原因是,当时编译选项里有一个 -O1,因此编译器会做一些优化。而在代码里,我们使用 Foo::a 的唯一地方是 main 里用它初始化了 x;但是由于 x 后续没有被使用,因此编译器把 x 的定义优化掉了,所以 Foo::a 就没有被使用了,因此没有报错。

具体来说,目前 C++ 编译分为 9 个步骤,大概可以理解为 1~6 完成词法分析,7~8 完成语法、语义分析和代码生成,9 完成链接。我们期望的「找不到定义」的错误是链接错误,发生在第 9 阶段;但由于在 7~8 阶段中编译器把 int x = Foo::a; 已经优化没了,所以程序中没有对 Foo::a 的访问了,因此没有发生链接错误。

如果用不会被优化掉的方式访问 Foo::a,我们就能看到预期的链接错误:

上课的时候没有看出来这个问题,抱歉QWQQQ

C++(5.5) const 和 static 成员的评论 (共 条)

分享到微博请遵守国家法律