课堂答疑(一)|前置篇、C 核心语法实现篇问题集锦
于航
该思维导图由 AI 生成,仅供参考
你好,我是于航。
看到这里的你,应该已经完成了本课程前两个模块的学习。随着课程的不断推进,我陆续收到了很多反馈。很高兴看到你在评论区积极留言,和大家一起讨论思考题。并且,还有很多同学提出了一些非常有意义的问题。那么,在继续学习后面更深入的内容之前,让我们先暂缓脚步,从问题出发,进行一次整体性的回顾。
在这一讲中,我会以加餐的形式,为你剖析一些值得讨论的思考题,以及你们提出的有代表性的问题。
这里,我将那段代码简化了一下,只提取出与问题相关的部分,放到了下面。因此,问题也变成了:对于下面这段代码来说,将函数 foo 定义中使用的 static 关键字去掉,是否会影响程序的正常编译和运行呢?
实际上,如果你能够在 godbolt 上快速实践一下,就会发现:在默认情况下(没有使用任何优化参数),编译器会报出类似 “error: ld returned 1 exit status” 的链接器错误;而在使用 “-O1” 及以上优化参数的情况下,编译器则可以正常编译。那么,为什么会这样呢?
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了C语言核心语法实现中的一些技术细节和讨论。首先讨论了在C代码中使用`static`关键字的作用,以及在不同优化参数下的编译结果。接着解释了`inline`关键字的使用方法,以及`inline static`和`static inline`的区别。文章还介绍了不同编译器下的汇编风格差异,以及编译器对非标准用法的处理方式。此外,还讨论了学习C语言是否需要了解汇编语言,以及`leave`指令在清理栈时是否会将相关内存清空的问题。最后,文章提到了编译器为什么会使用`lea`指令而非`mov`指令来实现某些简单的算数运算逻辑。总体而言,本文对于想要深入了解C语言实现细节的读者来说,是一篇值得阅读的文章。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入 C 语言和程序运行原理》,新⼈⾸单¥59
《深入 C 语言和程序运行原理》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(6)
- 最新
- 精选
- sugar请教于航老师一个问题,我的日常开发程序语言主要是JavaScript和C/C++,这个技术栈与老师应该比较类似。在js中,我们在运行时console.log可以打出任何一个代码中可见的变量的具体值,无论它是一个number、string这样的简单类型,还是各种类嵌套定义出的超级复杂的数据结构,这个能力在阅读其他人写的代码时很有帮助:我不确定一段程序中的某个符号代表的对象究竟是什么结构的时候,我可以直接去运行时把它log出来,尤其是项目代码量庞大的时候这能省去大量人肉读代码的时间;但是在c/c++当中,据我目前所知似乎只能cout 或者 printf出一个基本类型,比如int double char等,不能像js那样轻松的console.log出任何type的变量完整结构。请问于航老师在面对这种情况时是怎么处理?是否只能人肉一个一个class definition去翻代码?c的一些三方库只能翻到.h文件,翻不到具体实现.c或者.cpp文件。
作者回复: 可以试试 Visual Studio Code?我之前的 C++ 项目在 VSC 里单步调试的时候就可以直接 inspect 对应变量的内容(包括各类 STL 容器)。
2022-01-0332 - 火云邪神霸绝天下#include <stdio.h> void foo(void) { int x; printf("%d\n", x); x = 10; } int main(void) { foo(); foo(); return 0; } 这个代码两次输出都是0。不太明白它说清楚了什么。 本来不就该是 0 吗? 函数执行一次就栈内空间回收了吧。下次执行下次说。
作者回复: 试着在 “-O0” 下编译,再看看执行结果呢?
2022-01-191 - TableBear专属的微信群是哪个?还能进去吗
作者回复: @极客时间 小编,帮忙拉一下?
2022-08-09归属地:广东 - 青鸟飞鱼我觉得老师可以请大佬来讲讲c语言在redis应用哈哈,有了nginx,怎么能少了redis
作者回复: 好的,我帮你问问看哈哈哈。
2022-01-12 - ZR2021老师强大!!!2022-01-011
- FanGood2021-12-311
收起评论