Chapter0 GCC&编码规范
编程环境 vscode-cpp
Windows:
编辑器:VSCode
gcc编译器:MSYS2
gcc添加至环境变量
Linux:
编辑器:VSCode
gcc编译器:sudo apt install gcc
查询gcc环境:gcc -v
GCC编译器
GCC, the GNU Compiler Collection
The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Ada, Go, D, Modula-2, and COBOL as well as libraries for these languages (libstdc++,...). GCC was originally written as the compiler for the GNU operating system. The GNU system was developed to be 100% free software, free in the sense that it respects the user's freedom.
编译过程
预处理(#预处理指令) —— 编译(转为汇编码)—— 汇编(转为机器码)—— 链接(组合创建可执行文件)
编译器的主要任务是将高级编程语言(如C语言)的源代码转换为机器码或中间表示,以便计算机可以执行。在这一过程中,某些编译器确实会生成汇编语言作为中间步骤,但这并不是所有编译过程的必要部分。
-
预处理阶段:在这个阶段,预处理器处理所有的预处理指令(例如 #include 和 #define),并将宏替换为实际的代码。
-
编译阶段:接下来,编译器将预处理后的代码翻译成低级的汇编语言代码。对于一些编译器(如GCC),你可以通过指定特定的选项(例如 -S)来让编译器只进行到这一步并输出汇编文件,而不继续生成机器码。
-
汇编阶段:如果编译器生成了汇编代码,那么接下来的步骤就是使用汇编器将这些汇编代码转换成机器码,即目标代码(object code)。这个阶段产生的文件通常具有 .o 或 .obj 扩展名,并且包含可以直接由操作系统加载和执行的二进制数据。
-
链接阶段:最后,链接器将一个或多个目标文件与库文件组合在一起,解决符号引用问题,创建最终的可执行文件。
编译器特性
_attribute__实际上是GCC的一种编译器命令,用来指示编译器执行实现某些高级操作。__attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。
1.命名规范
类型 | 模板 | 示例 |
---|---|---|
文件 | 小写+下划线(功能_模块) | disp_driver.c |
函数 | 小写+下划线(模块_动词_名词) | disp_draw_line() |
变量 | 小写+下划线 | irq_count |
全局变量 | 小写+前缀g_ | g_systick |
指针变量 | 小写+后缀_ptr | buffer_ptr |
宏定义 | 大写+下划线 | QUEUE_BUF_NUM |
-
state与status命名
在程序代码中似乎很好区分:因为状态机(state machine)、状态迁移图 (state transition diagram)都是明确的state,所以如果「状态」的有效值之间可以儿搞出类似状态迁移图之类的东西,就命名为state;否则就用status。
比如TCP状态之间是有迁移关系的,所以是TCPstate;HHTTP状态码+由于没有互相迁移的关系,所以是HTTPstatuscode。
2.优秀编码准则
- 维护性:一般需要解耦合度,降低各功能代码块间的耦合度
- 复用性:需要将各功能代码块进行封装,用到时直接调用
- 扩展性:需要应用类的可继承性。或者配合使用工厂模式,让工厂根据不同的情形实例化不同功能的对象。
- 灵活性:需要满足以上三个特性,然后考虑实现跨平台ARM x86,可移植性等。
- 健壮性:考虑各异常情况,尽量使代码任何时候都能工作,否则抛出异常
- 可读性:例如if else 嵌套不要超过三层。语法不要复杂嵌套,例如多级指针
为什么需要优雅地写代码?
合理的,逻辑清晰的软件架构可以节省开发时间,节省调试时间,以及减少程序的bug。
代码运行正确性,可维护性都会提高,而且个人编程思维长进也藏在其中
3.注释规范
注释多不一定好,太多了会阻碍阅读的流畅性,首要(写优雅的代码,可读性强的代码,结构好的代码),次要(特殊行的注释,快速引导的注释,例如函数引导)