#普通宏定义
#define PI 3.14 //编译阶段替换掉宏#define T1 3+4 //容易产生歧义#define T2 (3+4) //添加括号后,语义清楚float r =1.0;float area = PI * r * r;int a =2* T1 #宏替换后变成 int a =2*3+4 不符合本意
ing a =2* T2 #红替换后变成 int a =2*(3+4) 符合本意
#undef PIfloat area = PI * r * r; #error: ‘PI’ was not declared in this scope
//引号中的宏定义不会被替换printf("%s:%f\n","PI", PI);//输出 PI:3.14//宏定义的名字必须是合法标识符#define 0x abcd //error 不能以数字开始//宏定义中双引号和单引号必须成对出现#define TEST11 "Z //error#define TEST2 'Z //error
二、带有参数的宏定义
//max和min的宏定义带参数#define MAX(a,b) (a>b ? a:b)#define MIN(a,b) (a<b ? a:b)//使用带参数的宏定义int sum=MAX(1,2)+MIN(1,2);//替换后语句为:int sum = (1>2 ? 1:2) + (1<2 ? 1:2)//参数个数必须宏定义时形参的个数相同MAX(1,2,3);//会报错#undef MAX //撤销MAX的宏定义MAX(1,2);//error: ‘MAX’ was not declared in this scope
三、跨行的宏定义 使用反引号\连接
#定义一个交换数值的多行宏,使用反斜杠连接不同行
#define SWAP(a,b) do { \
int t = 0;\
t = a; \
a = b; \
b = t; \
} while(0)