预处理命令简介
C语言源程序中以#开头,以换行符结尾的行称为预处理指令。
预处理指令不是C语言的语法成分,而是传给编译程序的各种指令。
C语言的预处理命令包括
(1)宏定义
#define
#undef
(2)文件包括
#include
(3)条件编译
(4)其他
宏定义
不带参数的宏定义
#define指令定义一个标识符来代表一个字符串,在源程序中发现该标识符时,都用该字符出来替代,已形成新的源程序。这种标识符称为宏名(macro name),将程序中出现的与宏名相同的标识符替代为字符串的过程称为宏替换。宏替换的操作是在编译时进行的。
不带参数的宏定义的一般形式是
#define 标识符 字符串
#define是宏定义的指令名称
标识符就是宏名,它被定义代表后面的单词串
单词串是宏的内容文本,也称为宏体,可以是任意以回车换行结尾的文字
宏一般不能用分号结尾,除非程序员故意这样做。
宏定义时,如果单词串太长,需要写多行时,可以在行尾使用反斜线\续行符
#define LONG_STRING “this is a very long string that is
used as an emample”
双引号包括在替代的内容之内
(3)宏名的作用域是从#define定义之后直到该宏定义所在文件结束,但通常把#define宏定义放在源程序文件的开头部分。如果需要终止宏的作用域,可以使用#undef命令。
(4)宏定义可以嵌套定义,但不能递归定义
(5)程序中字符串常量即双引号中的字符,不作为宏进行宏替换操作
#define XYZ this is a test
printf(“XYZ”)
(6)宏定义一般以换行结束,不要以分号结束
(7)宏可以被重复定义
(8)在定义宏时,如果宏是一个表达式,那么一定要将这个表达式用()括起来,否则可能会引起非预期的结果
带参数的宏定义
类函数宏
单词串是宏的内容文本,也称为宏体,其中通常会引用宏的参数
文件包含
文件包含是指,一个C语言源程序通过#include命令将另一个文件的全部内容包含进来。文件包含处理命令的一般格式
条件编译
if···#endif形式
elif是else if的缩写,但不可写成else if
#elif和#else可以没有,但#endif必须存在,它是#if命令的结尾
#elif命令可以有多个
if后面的条件必须是一个常量表达式,通常会用到宏名,条件可以不加括号
每个命令独占一行
#if和#elif常常与defined命令配合使用,defined命令的格式为
defined(宏名)或defined宏名
其功能是判断某个宏是否已经定义,如果已经定义,defined命令返回1,否则返回0
defined命令只能与#if或#elif配合使用,不能单独使用
例如,#if defined(USA)的含义是”如果定义了宏USA“
#ifdef···#endif
#else可以没有,但#endif必须存在,它是#if命令的结尾
在#ifedf和#else之间可以加多个#elif命令
#ifdef宏名 的含义是判断是否定义了宏,它等价于”#if defined(宏名)“。
#ifndef···#endif
#ifnef···#endif
与上一条的区别在于,如果宏名没有被#define行定义,则编译程序段1,否则编译程序段2
条件编译与分支语句不能混为一谈,下面给出了两者之间的差别
(1)条件编译是在预编译时处理;而条件语句则是在程序运行时处理。
(2)条件编译中的条件不可以包含变量名,只能是常量表达式(通常包括宏名),可以不加括号;而条件语句中的条件是条件表达式,可以包含常量或函数等,并且必须加括号
#define N 10
int NUM=10;
#if NUM=10 //错误,NUM是变量,可改为:# if N==10;
(3)条件编译是将满足编译条件的程序代码进行编译生成目标代码,不满足编译条件的程序代码将不进行编译;而分支语句则是不管满足条件的代码,还是不满足条件的代码,都要编译生成目标代码,所以如果用条件语句来代替条件编译命令,程序的目标代码将边长