01|快速回顾:一个 C 程序的完整生命周期
该思维导图由 AI 生成,仅供参考
学习这门课,需要怎样的实践开发环境?
- 深入了解
- 翻译
- 解释
- 总结
本文通过回顾一个 C 程序的完整生命周期,带领读者快速了解 C 语言的基础内容。文章首先介绍了学习该课程所需的实践开发环境,包括编译工具和 IDE 的选择。接着,通过一个相对复杂的示例代码,梳理了 C 语言的核心语法特性,包括入口函数、数组、结构与联合、控制结构、指针和宏等。文章以直观的方式展示了 C 语言的使用方式,帮助读者更容易理解这门课程的内容。整体而言,本文以技术性强、内容丰富为特点,适合对 C 语言感兴趣的读者快速了解 C 语言的基础知识。 文章还介绍了 C 语言的编程范式,将 C 语言作为一种“命令式”编程语言进行了解释,并与声明式编程语言进行了对比。此外,文章还涉及了 C 程序的编译和运行过程,详细介绍了代码预处理、编译优化、汇编和链接四个阶段。最后,通过思考题引发读者思考,为他们提供了一个思考和交流的机会。 总的来说,本文内容丰富,涵盖了 C 语言的基础知识、编程范式、编译和运行过程等多个方面,适合对 C 语言感兴趣的读者快速了解 C 语言的基本情况。
《深入 C 语言和程序运行原理》,新⼈⾸单¥59
全部留言(19)
- 最新
- 精选
- pedro置顶我尝试去掉了 findAddr 函数中的 static 关键字,如下: inline /*static*/ const char* findAddr(const CONN* pip) 再次尝试编译,发现完全编译不过: gcc -o demo -Wall ./example.c /tmp/ccPazvp1.o: In function `main': example.c:(.text+0x14f): undefined reference to `findAddr' collect2: error: ld returned 1 exit status 评论区几乎无人去动手,差点误导了我,我猜测是与 const 这个关键词有关,请老师详解一下
作者回复: 哈哈哈,实践出真知! 我直接在这里解答一下这个问题。正确情况下是如果在非优化的情况下,inline 需要配合 static 或者 extern 才能够编译。而在优化情况下,inline 可以单独使用。为什么会这样呢? 实际上,在 C17 标准中我们使用的 inline 关键字来源于 C99 标准。而在这个标准中,仅带有 inline 的函数具有 inline definition,表明该函数定义仅用于内联。而在非优化情况下,编译器通常会去寻找对应符号的 external definition(可以通过添加 extern 而获得),因此这种情况下会出现 linker error。而通过添加 static 关键字,可以使得对应函数定义具有 internal linkage,从而被编译器使用。在优化情况下,编译器会直接使用 inline definition 进行内联。 具体可以参考标准:http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf(112页,6.7.4.6)
2021-12-09338 - ZR2021置顶老师,为啥是inline static而不是static inline的?这里有点奇怪
作者回复: 这是一个好问题。首先,这两种写法都是可以正常工作的。在 C17 标准之前,declaration specifier 可以按照任意的顺序摆放。而自 C17 标准之后,便规定 storage-class specifier(包含 static)应该被放置在各类定义的最开始,其他形式则为过时的写法。 6.11.5 Storage-class specifier The placement of a storage-class specifier other than at the beginning of the declaration specifiers in a declaration is an obsolescent feature.
2021-12-0724 - ZR2021工作5年了,都是纯c开发,看了很多开源代码,内核代码,就是没时间好好总结深入,正好这次趁这门课跟着于老师好好总结学习下,万分期待!!!
作者回复: 哈哈哈,欢迎支持,一起学习!
2021-12-0737 - 送过快递的码农老师,宏和函数的区别是啥?我之前听说他比函数访问更加快?执行上面是否一致呢,函数要进行call,压栈,完事儿出栈,还得ret返回调用前地址 ,但是宏相对简单一点?函数编译需要链接,宏相当于常量,操作系统全局,所以不需要么?函数处理内容更加多,宏比较固定?主要Java程序员没接触过宏,所以感觉是个很陌生的领域
作者回复: C 中的宏你可以简单理解为根据一定规则对源代码进行的字符替换,并且这个过程是在编译器开始处理 C 语法代码之前就会进行的。这部分内容我们会在第 09 讲介绍哈。
2021-12-0653 - 勇闯天涯老师你好,有什么推荐的C语言书籍吗?偏进阶和高级篇的那种
作者回复: 可以看看《Modren C》?
2021-12-0831 - LDxyfindAddr函数一定要写在main函数的前面吗?
作者回复: 不一定哈,可以在函数调用前先写函数原型,然后函数体就可以放在任意位置了。
2021-12-071 - 神佑小鹿通过该指针,我们无法在函数内部修改指针所指向对象的值。 ?? 这个说法有问题吧??拿到地址了,可以改地址对应的内存吧
作者回复: 这里的指针是一个 const 指针,所以我们无法通过该指针来修改指向变量的值。
2022-05-042 - 纳兰容若老师您好 有个问题请教一下 咱们的示例程序中_Generic使用了c11的语法 类似的c11、c17中新用法在哪里查询呢 有类似MSDN的文档么
作者回复: 可以在这边看哈,不过需要科学上网:https://en.cppreference.com/w/c
2022-04-082 - JulyRemember为啥我用VScode去掉static可以编译通过并且运行结果是和不加值一样的,因为对C语言不太了解,所以也不知道为啥。
作者回复: 可以看一下是不是编译时使用了 -O0 以上的优化等级。
2022-03-21 - Geek_e95a91typename(),c标准支持嘛?
作者回复: 你是说 C++ 中的 template 吗?
2022-03-10