Fork me on GitHub

C语言杂谈——预处理程序

预处理的三种用途:

1)处理宏常量及宏函数;

2)合并(include)源文件;

3)条件性编译。


(一)#define和#undef

宏常量

格式:

#define  别名  常数或符号

#define与typedef的区别:

typedef char* STRING;
STRING pc1,pc2;

这意味着pc1,pc2都是STRING类型的变量。

#define STRING char*
STRING pc1,pc2;

这意味着pc1是字符指针变量;pc2是char类型的变量。

带参数的宏

文字取代;

1)一般用法

#define CLASS(type)  struct type

CLASS(book)
{
	int pages;
	double length;
	double width;
}

处理后变成为:

struct book
{
	int pages;
	double length;
	double width;
}

2)跨行的宏

使用“\”可将宏定义切分为数行。

如:

//第一个宏
#define CLASS(type)\
struct type\
{
//第二个宏
#define END\
};

//使用宏
CLASS(book)
	int pages;
	double length;
	double width;
END;

预处理后:

struct book
{
	int pages;
	double length;
	double width;
};

3)##的用法

//定义宏
#define FUN(type)\
type * type_function()

//使用宏
FUN(int)
{

}

预处理后:

int * type_function()
{

}

type_function是一个完整的名称,其中的type并不是参数。

//定义宏
#define FUN(type)\
type * type##_function()

//使用宏
FUN(int)
{

}

预处理后:

int * int_function()
{

}

type##表明此type是参数。

 

定义数学表达式:

1)表达式必须用小括号括住;

2)参数必须用小括号括住;

3)参数中避免出现“++”“—”。

例:

#define max(x,y)  ((x)>(y) ? (x):(y))
#define max3(x,y,z)	max(max(x,y),(z))

#undef (取消宏)

#define PI 3.1415926

#undef PI

#define ~ #undef 说明宏的有效范围

 

(二)条件性编译

#if	 宏常量

#else

#endif

条件编译的用途:

1)提高查错能力;

2)增加程序的可移植性。

 

(三)条件性定义

#ifdef 宏
#ifndef 宏
#endif
#else

用来解决(防止)重复定义。

posted @ 2012-11-21 20:55  韩兆新  阅读(571)  评论(0编辑  收藏  举报