宏定义:#define用来定义一个标识符和一个字符串,用这个标识符替代这个字符串。
1.不带参数的宏定义
#define 宏名 字符串
①#表示这是一条预处理命令;
②宏名,是一个标识符,要符合标识符的命名规则,并要求大写;
③字符串的位置可以是常量、表达式、格式字符串
注意:宏定义不是语句,不需要在末尾加分号;在编写程序时,通常将所有的#define放到文件开头的位置。
#undef的作用:结束宏定义的作用域。
比如:
#define TEST "This is an example"
int main()
{
printf(TEST);
#undef //之后的语句将不能再使用这个宏
return 0;
}
2.带参数的宏定义:不是简单的字符串替换,还要进行参数替换
定义形式:#define 宏名(参数列表) 字符串
#define MIX(a,b) ((a)*(b)+(b)) //一定记得加括号,不然容易出错,因为程序在替换字符串时,系统不会加括号,运算优先级有时就会出错
#define SUM(a,b) ((a)*(b))
int main()
{
int sun=SUM(5+2,3+4); //若定义时不加括号就会变成5+2*3+4,结果将会出错
return 0;
}
3.条件编译的三种形式:
第一种形式:
#include<stdio.h>
#define WIN
int main()
{
#ifdef WIN //根据WIN是否被定义决定执行哪一条语句
printf("WIN 已经预定义\n");
#else
printf("WIN 没有被预定义\n");
#endif
return 0;
}
第二种形式:
#ifndef 标识符
程序段1;
#else
程序段2;
#endif
与第一种形式的区别是将ifdef改为ifndef,它的功能是如果标识符未被定义,则对程序段1进行编译,否则编译程序段2,与第一种相反。
第三种形式:
#if 常量表达式
程序段1;
#else
程序段2;
#endif
如果常量表达式的值为真,则对程序段1进行编译,否则编译程序段2,因此可以使程序在不同条件下,完成不同的功能。
注意:上面的条件编译都可以用条件语句if-else实现,但用条件语句将会对整个源程序进行编译,生成的目标代码较长,而采用条件编译,则根据条件只编译其中的程序段1或程序段2,生成的目标代码较短。如果进行条件选择的程序段很长,采用条件编译可以大大提高程序的运行效率。