1、程序编译的四个阶段
阶段 | 功能 |
---|---|
预处理 | (引用头文件、宏定义、条件编译) |
编译 | 进行词法分析和语法分析,确认所有指令符合语法规则后,将其翻译成汇编代码。 |
汇编 | 把汇编代码翻译成目标机器指令,生成一系列目标文件。 |
链接 | 将目标文件按照链接规则链接成可执行文件。分为静态链接和动态链接,静态链接把静态链接库的代码拷贝到可执行文件中;动态链接不把链接库的代码拷贝到可执行文件中,而是在执行时才到动态库中找到对应代码。 |
2、volatile关键字
告诉编译器变量可能会意想不到地发生改变,在编译时不能对该变量进行优化,每次读取或者存取都要直接从变量地址进行操作。
举例:
1、硬件的状态寄存器
2、中断服务函数中访问到的非自动变量(全局变量、静态变量)
3、多线程中的共享变量
3、const修饰问题
const表示常量不可修改,定义常量时必须初始化。
const int N = 100; //定义常量N
N =50; //错误,常量不可修改
const int n; //错误,常量定义时必须初始化
const int *p(表示指针p指向的值不能修改,指针p可修改)
int const *p(同上)
int *const p(表示指针p不可修改,指向的值可修改)
const int *const p(表示指针p和指向的值都不可修改)
const修饰函数指针返回值,接收返回值的指针类型也必须是const。
const修饰函数指针形参,表明函数内不能对该指针指向的值进行修改;而如果形参是值传递,则不需要用const进行修饰。
有以下情况:
#define INTPTR1 int*
typedef int* INTPTR2;
const INTPTR1 p1; //p1为常量指针,指向的值不能修改,指向可修改
const INTPTR2 p2; //p2为指针常量,指向的值可修改,指向不可修改
4、static修饰问题
static变量初始化一次的原因:储存在静态区,初始化后变量不会被销毁,因此不会再初始化。
static修饰的局部变量,储存在静态区,只能在定义该变量的函数内使用,定义语句只执行一次,可多次赋值。
static修饰全局变量,储存在静态区,只能在定义的源文件中使用。
static修饰函数,只能在定义的源文件中使用。
5、预处理器标识#error
编译程序时只要遇到#error就会停止编译并报错。
#