C语言的三种预处理包括:宏定义(#define)、文件包含(#include)、条件编译(#if、#else、#endif)。
1,不带参数的宏定义:
#define 标示符 字符串
在预编译时将宏名(标示符)替换成后面的字符串。作用:减少重复书写某些字符串的工作量
注意预处理只是在编译之前作简单的“展开”,而不作错误检查,如下面代码
#include
#include
#define EXPRESS1 int a=1;
#define EXPRESS2 int a=b;
using namespace std;
int main()
{
int num = 0;
EXPRESS1
cout<
EXPRESS2
system("pause");
return 0;
}
编译出错:
错误 1 error C2374: “a”: 重定义;多次初始化
错误 2 error C2065: “b”: 未声明的标识符
1. 只有程序在编译已经被宏展开的源程序才会出错
2. 宏名的有效范围是自定义之处到本文件结束
-可以使用#undef终止宏定义作用域
-宏定义时,可以使用已有的宏名
-宏定义与定义变量不同,不分配内存空间
2,带参数的宏定义
#define 宏名(参数名) 语句
宏名与括号之间不能有空格,否则会将“(参数名) 语句”结束为一个字符串
-使用宏次数多时会使源程序变长,而函数不会,但调用函数时会占用运行时间(分配单元,保留现场,值传递,返回等)
#条件编译,对其中一部分内容只在满足一定条件下才进行编译,即对编译指定条件称为条件编译
第一种情况
#ifdef 标示符 (注意:标示符一般用#define命令定义)
程序段1
#else
程序段2
#endif
第二种情况
#ifndef 标示符 (注意:标示符一般用#define命令定义)
程序段1
#else
程序段2
#endif
第三种情况
#if 表达式 (注意:标示符一般用#define命令定义,如果表达式为真则编译程序1)
程序段1
#else
程序段2
#endif
如果定义宏时需要换行,就在每一行的末尾加上一个反斜杠