一、gcc的使用
(一)程序编译过程
程序编译的四个过程:预处理、编译、汇编、链接
1、预处理:gcc -E main.c -o main.i
生成.i文件将进行如下操作:
(1)将所有的#define删除,并展开所有的宏定义。
(2)处理所有的预编译指令,例如: #if,#elif,#else,#endif等
(3)处理#include预编译指令,将所包含的文件插入到预编译指令的位置
(4)添加行号信息,文件标识,便于调试
(5)删除所有的注释
(6)保留所有的#pragma编译指令,因为在编写程序的时候,我们经常要用到#pargma指令来设定编译的状态或者是指示编译器完成一些特定的动作。
(7)生成.i文件(包括去注释、宏替换、头文件展开、条件编译),编译生成的.i文件不包含任何宏定义,因为宏已经被展开,并且包含的文件已经被插入到.i文件中。
2、编译:gcc -S main.i -o main.s (将c/c++转换成汇编)
生成.s文件,需要进行如下操作:
(1)扫描、语法分析、语义分析、源代码分析、目标代码生成、目标代码优化
(2)生成汇编代码
(3)汇总符号
(4)生成.s文件
3、汇编:gcc -c main.s -o main.o (将汇编转换成二进制)
生成.o文件,需要进行如下操作:
(1)根据汇编指令和特定平台,把汇编指令翻译成二进制形式
(2)合并各个section,合并符号表
(3)生成.o文件
4、链接:gcc main.o -o main
链接过程会进行如下操作:
(1)合并各个.obj文件的section,合并符号表,进行符号解析
(2)符号地址重定位
(3)生成可执行文件
(二)gcc的使用
常用的两种生成可执行程序的方法:
gcc main.c -----> 生成可执行文件a.out
gcc -o main main.c -----> main.c生成可执行文件main
二、c语言注释规范
1、注释原则
项目开发中,尽量保持代码注释规范和统一;注释方便了代码的阅读和维护;边写边注释,修改代码时要相应修改注释,保证注释和代码的一致性;注释要简介明确,不要出现形容词;通过注释可以快速知道所写函数的功能,返回值,参数的使用。
2、文件的头部注释
/*******************************************
* @File name: main.c
* @Author: jxx
* @Version: 1.0
* @Date: 2022-10-31
* @Description: The function interface
********************************************/
3、结构体、全局变量等的注释
int num; /* 全局变量的作用 */
/* 结构体的功能 */
typedef struct{
int h; /* High risk */
int l; /* Low risk */
int m; /* Middle risk */
int i; /* Infomation risk */
}risk;
4、函数的注释
函数头部应进行注释,列出:函数的目的/功能、输入参数、输出参数、返回值、调用关系(函数、表)等
/*********************************************************
* Function name: insert_hhistory
* Description: Insert to bd_host_history
* Parameter:
* @ipsql SQL statement
* @host_level Risk level
* @total The total number of risk
* @t_id task id
* @t_uuid task uuid
* @ipaddr target ipaddr
* @end_time task end time
* Return: 0 -- success, other -- fail
**********************************************************/
int insert_hhistory(char *ipsql, risk host_level, int total, int t_id, char *t_uuid, char *ipaddr, long int end_time)
{
/*
* 如果程序过于复杂,这里可以写明,具体算法和思路。
*/
}
5、建议
一般情况下,源程序有效注释量必须在20%以上。注释不宜太多、不宜太少,准确简洁易懂;
注释格式尽量统一,建议使用/*......*/;
避免一行代码或表达式的中间插入注释;
说明:除非必要,不应该在代码或表达中间插入注释,否则容易使代码可理解性变差
通过对函数或过程、变量、结构等正确的命名,可增加代码的可读性,并减少不必要的注释
在代码的功能、意图层次上进行注释,提供有用、额外的信息
说明:注释的目的是解释代码的目的、功能和采用的方法,提供代码以外的信息,帮助读者理解代码,防止没必要的重复注释信息。
三、C语言数据类型
c语言的数据类型分为四大种:
1、基本类型:
a.数值类型:分为整型(short, int, long)和浮点型(float, double)
b.字符类型:char
2、构造类型:
a.数组
b.结构体struct
c.共用体union
d.枚举类型enum
3、指针类型
4、空类型void
常用的ASCLL码:'A': 65 'a': 97 (大小写相差32)
四、常量与变量
1、常量:常量是指在程序运行过程中其值不发生改变的量称为常量
直接常量 | 可直接使用,无需任何说明的量,例如整型常量、实型常量以及字符常量 |
符号常量 | 用标识符代表一个常量,c语言中,可以用一个标识符表示一个常量,称之为符号常量 |
在使用符号常量之前一定要对其进行定义,一般形式为:
#define 标识符 常量
#define又称宏定义,标识符为所定义宏名。其功能是把该标识符定义为其后的常量值。定义之后,一旦以后的程序再次出现该标识符的地方均用该常量值替代。
**通常符号常量的标识符用大写字母,变量标识符用小小写字母,以示区别。
2、变量: 变量是指在程序运行时其值可以改变的量,变量的功能就是存储数据。每个变量都有特定的类型,类型决定了变量存储的大小和布局。
变量定义的一般格式:
类型说明符 变量名;
定义变量时的一些注意事项:
a.最后一个变量名之后必须以;结尾
b.变量定义必须放在变量使用之前
c.允许在一个类型说明符后,定义多个相同类型的变量,各变量名之间用逗号隔开
变量可以先定义再赋值,也可以在定义的同时赋值;在定义变量的同时赋初值称为初始化
在变量定义中赋初值的一般形式为:
类型说明符 变量1=值1,变量2=值2,.......
3、枚举常量:枚举常量是要占用内存的,他在内存中开辟一个空间来存放枚举变量;其常量值在没有赋值时系统会默认给他的第一个变量赋值0,后面的依次为1、2...使用枚举类型的最大好处是使得程序可读性增强。
enum Sports
{
//枚举常量
basketball,
score,
tennis
};
int main()
{
enum Sports s = basketball;
printf("basketball = %d\n", basketball);
printf("score = %d\n", score);
printf("tennis = %d\n", tennis);
return 0;
}
注:
(1)枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用,隔开
(2)可以认为设定枚举成员的值,从而自定义某个范围内的整数
(3)枚举型是预处理指令#define的替代
(4)类型定义以分号;结束
4、常变量
const(c++中的关键字): const定义的是变量,但又相当于常量;说他定义的是常量,但又有变量的属性,所以叫常变量。用const定义常变量的方法很简单,就在通常定义变量时前面加const即可,如:
const int a = 10;
5、区分#define 和 const
要区分#define命令定义的符号常量和用const定义的常变量:
const定义的是变量而不是常量,只是这个变量的值不允许改变是常变量,带有类型,编译运行的时候起作用存在类型检查。
#define定义的是不带类型的常数,只进行简单的字符替换。在预编译的时候起作用,不存在类型检查。
五、格式化输入输出函数
1、格式化输入函数:scanf()
2、格式化输出函数:printf()
3、常用的转换控制符:
%d、%i | 以十进制格式输出一个整数 |
%o、%x | 以八进制格式输出一个整数 |
%c | 输出一个字符 |
%s | 输出一个字符串 |
%f | 输出一个单精度浮点数 |
%e | 以科学计数法格式输出一个双精度浮点数 |
%g | 以通用格式输出一个双精度浮点数 |
%% | 读取一个%字符 |
4、字符限定符:
"-": 左对齐格式输出
"*": 可变字段宽度
0: 0开头表示数据前面用0填充