编译过程

C语言编译过程,层次递增,后边命令包含上边命令所有功能

define include 不是关键字,他们在预编译的时候就被替代了。

常见编译错误

  1. 预处理错误

#include”file.h“ 默认先从当前路径中寻找,找不到再从系统环境中查找。
#include<file.h> 直接从系统环境中寻找

NOT FIND 注意自己创建用双引号。
解决方法:可以通过相对路径;通过写入头文件路径的方式。

相对路径

-I+路径
2. 链接错误
原材料不够或者溢出。

  • 缺少原材料

函数缺少实现

链接器报错

  • 原材料溢出

链接器错误

原因是链接重复的函数。

预处理的使用

  1. #include 包含头文件
  2. #define 宏,替换 预处理时不进行检查直接进行替换,在编译时才进行检查
  3. #define 宏名 宏体 为了避免错误,加括号
1
2
3
4
5
6
//错误例子
#define ADD35 3+5
printf("%d",ADD35 *5); //3+5*5=28
//正确例子
#define ADD35 (3+5)
printf("%d",ADD35 *5); //(3+5)*5=40
  1. 系统预定义宏

前后双下划线

方便用于调试
5. 条件宏变量

多用于控制不同版本的变量。(开发版与测试版)

如果定义了ABC则会输出,不定义则没有输出结果
同时可以通过命令来进行控制宏变量。

1
2
gcc -D:
gcc -DABC == #define ABC

gcc -D
6. 宏展开下的 #、##

#、##

#

##

数据类型

注意数据类型所占位数,防止溢出

1
2
3
4
8bit = 1B
char = 1B
所以char最大不超过 2^8=256.
char a =300. a++会报错。

int大小的定义

编译器最优的处理大小(由编译器决定):
系统一个周期,所能接受的最大处理单位,int
32位系统,单词执行32bit,所以int大小32bit=4byte
单片机中存在16位系统,则int = 2B

signed与unsigned的注意

signed包含符号位,而unsigned不包含,所以进行位操作的时候会出现不同情况。

1
2
-1=0xff
signed右移后不会变化。而unsigned会变化,最后变为0.

类型修饰符

类型修饰符

auto

register

由于寄存器没有地址,所以对存入寄存器的值进行取址是无效的。

取址失败

volatile 关键字

volatile

硬件中乘除法需要注意

乘除法