1.预处理
文件包含:
#include<>:到系统指定的路径寻找,一般是:/user/include; #include “”:优先从当前目录开始,一般适用于自定义头文件。2.宏定义
#define PI 3.1415
单纯的替换
注意:不要加等号,不要末尾加分号。3.带参数的宏
#define MAX(x,y) (x)>(y)?(x):(y)
注意:
- 带参数的宏,参数不能是多次计算后的数值。比如:MAX(x++,j++); //错误
- 每个宏都应该被包含在一对小括号里面,保证运算顺序。
#define MUL(x,y) x*y //很容易出错,MUL(1+2,2+3),替换后1+2*2+3#define MUL(x,y) (x)*(y)//还是会错,30/MUL(1+2,2+3),替换后30/3*5,但是其实是想30/(3*5)#define MUL(x,y) ((x)*(y))//这样才对
4.运算符
//#:将宏中的参数转换为字面值常量。限定:只能出现在带参数的宏的替换列表中。 #define PRINT(n) printf(#n"=%d",n) //##:将两个标识符粘合在一起形成一个标识符 #define MK_ID(n)i_##n MK_ID(1) i_1 MK_ID(23) i_23
5.C语言中预定义的宏:
<1>__LINE__:当前正当编译的程序的行号 %d<2>__FILE__:当前正当编译的源程序的名字 %s<3>__DATE__:编译程序的日期 %s<4>__TIME__:编译程序的时间 %s<5>__STDC__:判断编译器是否符合C标准,返回0或者返回1。一般:__STDC__?"符合":"不符合"
6.条件编译:
#if 、#elif 、#else、#endif
防止该头文件被重复引用。#if defined(DB_SQLSERVER) // 如果定义了DB_SQLSERVER connectSQLServer(); // 连接SQLServer数据库#elif defined(DB_ACCESS) // 如果定义了DB_ACCESS connectACCESS(); // 连接ACCESS数据库#else // 如果没有定义数据库类型 printerror(); // 输出错误信息#endif
好例子:
//交换两个参数值的宏定义为:#define SWAP(a,b)\(a)=(a)+(b);\(b)=(a)-(b);\(a)=(a)-(b);//输入两个参数,输出较小的一个:#define MIN(A,B) ((A) < (B))? (A) : (B))//表明1年中有多少秒(忽略闰年问题):#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL//已知一个数组table,用一个宏定义,求出数据的元素个数#define NTBL#define NTBL (sizeof(table)/sizeof(table[0]))