预编译
(1) 宏定义
1.不带参数的宏定义
用一个宏名代替一个字符串,只进行简单的代换,不进行任何计算,也不进行正确性检查,双引号内的宏名不进行代换,宏名一般用大写表示。
#define PI 3.1415926
#define定义有效范围是定义处到源文件结束,通常写在文件开头,函数前,在此文件内有效。
#define PI 3.1415926
int main()
{
return 0;
}
int main()
{
#define PI 3.1415926
return 0;
}
可以用#undef命令结束作用域。
#define PI 3.1415926
int main()
{
return 0;
}
#undef PI
进行宏定义时,可以用已定义宏名,层层代换。
#define R 1
#define PI 3.1415926
#define L2*PI*R
2.带参数的宏定义
#define 宏名(参数表) 宏体
#define MUL(a, b) a*b
#define ADD(x, y) x+y
eg:sum = ADD(1, 2); 则被替换成sum = 2 + 4;
sum = ADD(a+2, b+3); sum = a + 2 + b + 3;
t =MUL(a+1, b+1); t = a+1*b+1;
注意:宏名与左括号之间不能出现空格。字符串中与参数名相同的字符序列适当的加上圆括号,这样可以避免代换后优先级上产生问题。
eg:#define MUL(x) (x)*(x)
#define MUL(x)((x)*(x))
(2)条件编译
利用条件编译可以使同一个源程序在不同条件下产生不同代码,来完成不同功能。利用条件编译可在调试程序时添加一些调试语句,以达到跟踪目的,但程序调试好后,重新编译时,使调试语句不参与编译。
1.#ifdef 宏名
程序段1
(#else 程序段2)
#endif
其功能为如果宏名已定义,则编译程序段1,否则程序段2.可提高程序通用性。
eg:#ifdef COMPUTER
#define INTEGER_SIZE 16
#else
#define INTEGER_SIZE 32
#endif
只要COMPUTER被宏定义过,则编译后INTEGER_SIZE被 16代替。
2. #ifdnef 宏名
程序段1
(#else 程序段2)
#endif
如果宏名没被定义则编译程序段1
3.#if 表达式
程序段1
[#else 程序段2]
#endif
表达式是一个常量表达式,其功能为:如果表达式的值不为0,则编译程序段1;否则,段2,各种条件编译可嵌套使用。
eg:#if x > 4
#if x > 4 && x < 8
int x = 5;
#else
int x = 2;
#endif
#else
int x = 100;
#endif