3. 宏定义
3.1 宏定义的格式:#define 标示符 替换列表3.2 常见错误:
#define N=10 /* 错误使用了等号(=)*/
#define N 10; /*错误使用了分号(;)*/
3.3 使用宏定义的优点:
3.3.1 程序可读性更强,例如:在程序中使用AGE,比使用20,可读性更强。
3.3.2 程序修改方便,程序中如果有100个地方使用了宏定义,我们只修改宏定义一个地方就可以把100个地方修改
3.3.3 可以避免前后不一致,例如:可能把3.1415写成 3.14,如果定义为宏可以避免写错。
3.3.4 可以对C语法结构做出修改,例如:可以把{}定义为BEGIN 和END
#define BEGIN {
#define END }
3.3.5 可以进行类型定义,例如: #define BOOL int
3.3.6 控制条件编译,例如: #define DEGUG 1 ,在程序完成后把1改为0,调试信息将不再输出。
3.4 带参宏定义
3.4.1 定义格式:#define 标示符(x1,x2,x3) 替换列表
3.4.2 实例 #define MAX(x,y) ((x)>(y)?(x):(y)) #define IS_EVEN(n) ((n)%2==0)
#include <stdio.h>
#define MAX(x,y) ((x)>(y)?(x):(y))
#define IS_EVEN(x) ((x)%2==0)
#define AVG(x,y) (((x)+(y))/2)
void test1(){
int x = 10,y = 20;
int r = MAX(x, y);
printf("r=%d\n",r);
r = IS_EVEN(x);
printf("r=%d\n",r);
x = 19;
r = IS_EVEN(x);
printf("r=%d\n",r);
x = 30;
r = AVG(x, y);
printf("r=%d\n",r);
}
3.4.3 #运算符
#运算符将参数转换为字符串字面量,例如:#define PRINT_INT(x) printf(#x"=%d\n",x)
#define PRINT_INT(x) printf(#x"=%d\n",x)
void test2(){
int x = 100;
PRINT_INT(x);
int y = 1000;
PRINT_INT(y);
}
程序输出为:
x=100
y=1000
3.4.4 ##运算符
##运算符将两个标示符连接在一起,例如:#define MK_ID(id) n##id
#define MK_ID(id) n##id
void test3(){
int MK_ID(1),MK_ID(2);// 结果为 int n1,n2;
}
3.5 宏可以嵌套定义,例如:#define PI 3.14 #define PI2 PI*2
#define PI 3.14
#define PI2 PI*2
void test4(){
float r = 3.0;
float s = 2*PI*r;
printf("s=%f\n",s);
s = PI2*r;
printf("s=%f\n",s);
}
3.6 系统预定义宏
void test5(){
// 打印编译信息
printf("被编译行数=%d\n",__LINE__);
printf("源文件名=%s\n",__FILE__);
printf("编译日期:%s,编译时间:%s\n",__DATE__,__TIME__);
printf("编译器是否支持C标准:%d",__STDC__);
}
程序输出结果:
被编译行数=21
源文件名=/Users/amaker/Desktop/极客网站/01 网站课程/01 iOS 开发/01 c语言/参考资料/new/12 预处理器/C-12-01/C-12-01/main.c
编译日期:Oct 16 2013,编译时间:10:23:41
编译器是否支持C标准:1
该博客教程视频地址:http://geek99.com/node/1016