一.思维导图
二.Linux下对C语言程序编译的四个步骤
使用gcc把C文件编译成可执行文件可分为四步:预编译、编译、汇编、连接。
1、预编译(生成.i文件)
预编译器cpp把源文件和相关的头文件(如实例代码中的头文件stdio.h)预编译成一个.i的文件。
执行的命令:gcc -E hello.c -o hello.i
预编译的作用:
a、处理所有的“#include”预编译指令
b、处理所有的"#define"指令,将代码中所有的"#define"删除,并展开所有的宏定义
c、处理所有的条件预编译指令,如#if #elif #else #ifdef #ifnodef #endif等
d、删除所有的注释
e、添加行号和文件名标识,以便产生错误时给出提示信息
2、编译(生成.s文件)
编译器gcc把预处理后的文件进行语法分析、语义分析以及优化后生成汇编代码文件。
执行的命令:gcc -S hello.i -o hello.s
3、汇编(生成.o文件)
汇编器把汇编代码文件转换成中间目标文件
执行的命令:gcc -c hello.s -o hello.o
4、链接(生成可执行文件)
链接器ld把目标文件与所需要的所有的附加的目标文件(如静态链接库、动态链接库)链接起来成为可执行的文件
执行的命令:gcc hello.o -o hello.out
三.宏定义
1.宏定义是由源程序中的宏定义命令完成的。
2.宏代换是由预处理程序自动完成的。
3.宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是简单的一种代换,字符串可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不做任何检查,如有错误,只能在编译已被宏展开后的源程序发现。
4.宏定义不是说明或语句,在行末不必加分号.
5.宏定义 必须写在函数外面,其作用域为宏定义命令起到源程序结束。
例:
四.标准输入输出函数
函数原型
int printf(const char *format, ...);
printf使用时,需要一个格式符和一个格式符对应类型的数据
printf("占位符/格式符",输出表象); //有一个格式符就要有一个输出表象
printf("%d\n",10); //10就是输出表象,%d就是10对应的格式符
printf("%c",'c'); //字符c时输出表象,%c是字符c对应的格式符
转义字符,就是有特殊意义的字符
\n:换行 10
\t:制表符 一个tab键的大小4个空格
\b:退格
\r:回车 回退到行首进行输出
\\:输出一个\,键盘上回车上面的\反斜杠,不是除号
格式符
%d:整形数据的格式符
%-nd:以n个数据宽度左对齐输出,不够就补空格
%nd:以n个数据宽度右对齐输出,不够就补空格
%ld:长整型数据的格式符
%f:浮点型的格式符,printf默认输出小数点后6位
%.mf:指定小数点后的输出位数
%lf:双精度浮点型的格式符
%c:字符型的格式符
%s:字符串的格式符
%#x:输出十六进制,并且带前导符0x,小写x,输出十六进制时对应的字母都是小写的
%#X:输出十六进制,并且带前导符0X,大写x,输出十六进制时对应的字母都是大写的
%%: 输出一个%
五.进制转换
0111 1100B ----> 124D
93D ------> 101 1101B
153D -----> 0x99
1010 0001B -----> 0241
1011 1000B ------>0xB8