1、预编译(何时)
- 整个编译最先做的工作,不经常改动大型代码体;
- 所有模块都使用标准头文件
2、#define MIN(x,y) ((x) < (y) ? (x) : (y)) 没有分号
3、#是将宏转化为字符串的运算符,##是把两个宏参数连接的运算符
4、避免头文件被重复包含
#ifndef __xxx_H
#define __xxx_H
#endif
5、static关键字
- 修饰存储类型(静态存储)
- 修饰链接属性(内部链接)
- 函数内定义:静态局部变量存储内存静态区;
- 函数外定义:静态全局变量作用域仅在当前文件,不能被其他文件通过extern 引用
- 静态函数只能在声明它的源文件中使用
- 全局变量存储在静态数据区,局部变量在堆栈中。函数内局部变量:自动变量,形参存储在栈中;malloc手动创建存储在堆中;
6、const关键字(相关值与地址不能修改)
- 修饰常变量;
- 修饰函数形参;
- 修饰函数返回值;
7、volatile关键字:指定的关键字可能被系统,硬件,进程/线程改变,所以强制编译器每次从内存中取值,而不是直接从寄存器中取值(eg:多线程被多个任务共享的变量)
8、extern 关键字:表明该变量或函数在别的文件中定义,提示编译器查找;
- c++文件调用c使用extern "C"
#ifdef __cplusplus
extern "C"
{
#endif
#ifdef __cplusplus
}
#endif
9、inline关键字是建议编译器做内联展开处理,即是将函数直接嵌入调用程序主体,省去调用/返回指令
10、引用与指针区别
11、#include <xxx.h> 前者是从standard lib路径中寻找引用 ;
#include "xxx.h" 当前工作路径寻找引用
12、实时系统:在特定时间内完成特定任务,实时与可靠
13、堆:由程序员分配释放,栈:由编译器分配释放
14、中断可重入函数:多任务环境中可以被中断的函数
可以在这个函数执行的任何时刻中断它,转入 OS 调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。
不可重入:
- 函数体内使用静态数据结构
- 函数体内调用malloc()/free()函数
- 如果其他线程调用该变量,会导致中断处理函数不能及时返回,导致中断丢失问题
在多线程环境中,且没有加锁的情况下,对同一段内存进行并发读写,就会造成泄露。
15、strcpy()与strncpy代替使用;memcpy()
16、大小端模式
- 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。
- 小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。