一、编译器
1.预处理 gcc -o test.i -E test.c
2.编译 gcc -o test.s -S test.i
3.汇编 gcc -o test.o -c test.s
4.链接 gcc -o test test.o
预定义符号
二、宏
1.分号问题
#define MAX 1000
if(condition)
max = MAX;
else
max = 0;
//相当于
//#define MAX 1000;
//
//if(condition)
//max = MAX (无法匹配宏)
//空语句;
//else
//max = 0;
//相当于
2.参数列表的左括号必须与name紧邻。
如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部 分。
3.括号问题
#define DOUBLE( x) ( ( x ) + ( x ))
所以用于对数值表达式进行求值的宏定义都应该用这种方式加上括号,避免在使用宏时由于参数中的操作符或邻近操作符之间不可预
4.对于宏,不能出现递归。
5.使用 # ,把一个宏参数变成对应的字符串
6.##
7.副作用
#define MAX(a, b) ( (a) > (b) ? (a) : (b) )
...
x = 5;
y = 8;
z = MAX(x++, y++);
printf("x=%d y=%d z=%d\n", x, y, z);//输出的结果是什么?
z = ( (x++) > (y++) ? (x++) : (y++));
x=6 y=10 z=9//先加再比较,若x大则x再加一遍,若y大则y再发一遍
8.对比

三、
《高质量
C/C++
编程指南》
有关精度控制 float比较的内容,值得一看