-
#define
用法集锦
[
修正版
]
Definitio
n[
定义
]
:
The #define Directive
You
can use the #define directive to give a meaningful
name to a
constant in your program. The
two forms of the syntax are:
Syntax
#define identifier token-stringopt
#define identifier[( identifieropt, ...
, identifieropt )] token-stringopt
Usag
e[
用法
]
:
1.
简单的
define
定义
#define MAXTIME 1000
一个简单的
MAXTIME
就定义好
了,它代表
1000
,如果在程序里面写
if(i
编译器在处理这个代码乊前会对
MAXTIME
迚行处理替换为
1000
。
这样的定义看起来类似于普通的常量定义
CONST
,但也有着不同,因为
define
的定义更像是简单的文本
替换,而不
是作为一个量来使用,这个问题在下面反映的尤为突出。
p>
的
“
函数定义
”<
/p>
define
可以像函数那样接受一些参数,如下
#define max(x,y) (x)>(y)?(x):(y);
这个定义就将返回两个数中较大的那个,看到了吗?因为这个“函数”没有类型检查,就好像一个函 数模
板似的,当然,它绝对没有模板那么安全就是了。可以作
为一个简单的模板来使用而已。
但是这样做的话存在隐患,例子如下:
#define Add(a,b) a+b;
在一般使用的时候是没有问题的,但是如果遇到如:
c *
Add(a,b) * d
的时候就会出现问题,代数式的本意
是
a+b
然后去和
< br>c
,
d
相乘,但是因为使用了
define
(它只是一个简单的替换),所以式子实际上变成
了
c*a + b*d
另外举一个例子:
#define
pin (int*);
pin a,b;
本意是
a
和
b
都是
int
型指针,但是实际上变成
int* a,b;
a
是
int
型指针,而
b
是
int
型变量。
这是应该使用
typedef
来代替
define
,这样
a
和
b
就都是
int
型指针了。
所以我们在定义的时候,养成一个良好的习惯,建议所有的层
次都要加括号。
3.1
宏的单行定义(少见用法)
#define A(x) T_##x
#define
B
(
x) #@x
#define
C
(
x) #x
我们假设:
x=1
,则有:
A(1)------
〉
T_1
B(1)------
〉
'1'
p>
C(1)------
〉
< br>(这里参考了
hustli
的文章)
3.2
define
的多行定义
define
可以替代多行的代码,例如
MFC
中的宏定义(非常的经典,虽然让人看了恶心)
#define MACRO(arg1, arg2) do {
/* declarations */
stmt1;
stmt2;
/* ... */
} while(0) /* (no trailing ) */
关键是要在每一个换行的时候加上一个
4.
条件编译
在大规模开収,
< br>特别是跨平台和系统的软件里,
define
最重要的功
能是条件编译。
就是:
#ifdef WINDOWS
......
......
#endif
#ifdef LINUX
......
......
#endif
可以在编译的时候通过
#define
设置编译环境
5.
如何定义宏、取消宏
//
定义宏
#define [MacroName] [MacroValue]
//
取消宏
#undef [MacroName]
//
普通宏
#define PI (3.1415926)
带参数的宏
#define max(a,b) ((a)>(b)?
(a),(b))
关键是十分容易产生错误,包括机器和人理解上的差异等等。
6.
条件编译
#ifdef XXX
…
(#else)
…
#endif
例如
#ifdef DV22_AUX_INPUT
#define AUX_MODE 3
#else
#define AUY_MODE 3
#endif
#ifndef XXX
…
(#else)
…
#endif
7.
头文件
(.h)
可以被头文件或
C
文件包含;
重复包含(重复定义)
由于头文件包含可以嵌套,那么
C
文
件就有可能包含多次同一个头文件,就可能出现重复定义的问题的
通过条件编译开关来避免重复包含(重复定义)
例如
#ifndef
__headerfileXXX__
#define
__headerfileXXX__
…
//
文件内容
…
#endif
< br>Instances[
实例
]
:
1
、防止一个头文件被重复包含
#ifndef COMDEF_H
#define
COMDEF_H
//
头文件内容
#endif
2
、重新定义一些类型
防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。
typedef unsigned char boolean; /*
Boolean value type. */