- 预处理
在程序编译之前进行的处理,所有的编译预处理命令以#开头。分为宏定义、文件包含、条件编译。
1. 宏
宏定义的作用是某段代码的别名,以#define开头,结尾不用分号。
eg:#define PI 3.14//宏名一般用大写字母
在编译预处理时,只是简单的替换。宏名的有效范围是从定义位置到文件结束。如需终止宏定义的作用域,可以用#undef命令。
eg:#define PI 3.14
//......
#undef PI
若已定义的标识符在字符串中出现,则不替换。
eg:
- 无参宏:上述为无参宏
#define R 2.0
#define PI 3.14
#define L 2*PI*R//可以在宏定义的时候引用已定义的宏
- 有参宏:
#define S(a,b) a*b
S(1+2,3);//表达式替换成a+b*3
#define S(a,b) (a)*(b)//此时S(1+2,3)将替换成(1+2)*3
注:有参宏定义时,宏名与参数间不能有空格,否则将空格后
字符替换成宏名(成为无参宏)。
- 有参宏:
2.文件包含
将指定的文件内容嵌入到指定源文件中,包括两种方式。
#include"xxx.x"//通用方式。此方式一般包含自己写的文件,即先在源文件所在目录中查找要包含的文件,若未能找到则按标准方式查找。
#include<xxx.x>//标准方式。此方式只在c语言编译器的c函数库头文件中查找要包含的文件。
3.条件编译
#ifdef 宏名 /*程序段1*/
判断某个宏是否被定义, 若已定义, 执行随后的程序段1(类似于if判断语句)。#else/*程序段2*/
if判断后,若宏未定义则执行程序段2。
eg:#define PI 3.14
#ifdef PI
程序段1
#else
此时执行程序段1。
程序段2
#ifndef 宏名 /*程序段1*/
r若宏名没有被定义则执行程序段1
#endif
为#if, #ifdef, #ifndef这些条件命令的结束标志。