主要使用的预编译处理指令有下面9个:
#define #undef #include #if #elif #else #endif #ifndef # ifdef
预处理命令共同的语法规则有下面6条:
所有的预处理命令在程序中都是以“#”来引导
每一条预处理命令必须独占一行,在一行中写#include "stdio.h" #include <stdlib.h>是非法的。
预处理命令后不可以加分号
预处理命令一行写不下,可以续行,但要加续行符,"/"
宏定义与文件包含命令一般放在程序开头,(原则上放到任何地方)
所有预处理命令作用域都是从定义开始到程序结束
宏定义
不带参数的宏定义
#define 宏名 字符串
在程序执行中,遇到宏名,将进行宏替换。
定义了宏以后,如果在程序某个部分不想再用或者想将宏名重新定义,应先用 #undef 宏名 结束某个某定义
若宏名用引号括起来,则当成一般字符串处理
带参数的宏定义
#define <宏名>(<参数表>) <宏体>
需要注意的是括号在带参数的宏定义中的使用: 如#define SQ(x) x*x 与
#define SQ(x) (x)*(x)的区别。
带参数的宏与函数的区别:
函数的形参与实参都要求定义类型,而且两者要求一致,若不同,还要进行强制类型转换。而宏不存在此类问题,宏没有类型,
参数也无类型,它们都只是一种符号代表,宏展开时将它们进行代换。
在程序中使用宏,宏展开后源程序会变长。而函数调用不会。
宏替换不占用程序运行时间,只占编译时间。而函数调用则占运行时间(分配单元、保留现场、值传递、返回)。
条件编译指令
有时希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。
1.#if~#endif:
#if 常量表达式
程序段 /*当常量表达式的结果为非0时,编译或保留程序段*/
#endif
2.#if ~#else ~#endif:
#if 常量表达式
程序段1 /*当常量表达式的值为非0时,编译或保留程序段1*/
#else
程序段0 /*当常量表达式的值为0时,编译或保留程序段0*/
#endif
#ifdef 标志符
程序段1
#else /*如果不需要,可以不用#else部分*/
程序段2
#endif
#ifndef 标志符
程序段1
#else
程序段2
#endif
结束:常用的三种预处理命令:宏定义,文件包含,条件编译。
在使用宏定义的时候要特别注意括号的使用
关于预处理命令还有许多细节需要注意的地方,如,使用宏还是使用函数好?用#define有什么好处?。。。我只陈列了一些常
用的需要记忆的部分抛砖引玉。