-
#define
用法以及
#define
和
typedef
区别
1.
简单的
define
定义
#define MAXTIME
1000
的“函数定义”
define
可以像函数那样接受一些参数,如下
#define max(x,y)
(x)>(y)?(x):(y);
因为这个“函数”没有类
型检查,就好像一个函数模板似的,没有模板那么安全就是了。
但是这样做的话存在隐患,例子如下:
#define Add(a,b)
a+b;
如果遇到如:
c * Add(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.
宏的单行定义(少见用法)
#define A(x) T_##x
#define
B(x) #@x
#define C(x) #x
我们假设:
x=1
,则有:
< br>
A(1)------
〉
T_1
B(1)------
〉
'1'
p>
C(1)------
〉
< br>
的多行定义
define
可以替代多行的代码,例如
MFC
中的宏定义(非常的经典,虽然让人看了恶心)
#define MACRO(arg1, arg2) do {
/* declarations */
stmt1;
stmt2;
/* ... */
} while(0) /* (no trailing ) */
关键是要在每
一个换行的时候加上一个
5.
在大规模的开发
过程中,特别是跨平台和系统的软件里,
define
最重要的
功
能是
条件编译
。
就是:
#ifdef
WINDOWS
......
......
#endif
#ifdef LINUX
......
......
#endif
可以在编译的时候通过
#define
设置编译环境。
6.
如何定义宏、取消宏
#define [MacroName] [MacroValue]
//
定义宏
#undef
[MacroName] //
取消宏
#define PI (3.1415926)
//
普通宏
#define
max(a,b) ((a)>(b)? (a),(b))
//
带参数的宏
7.
条件编译
#ifdef
XXX
?
(#else)
?
#endif
例如
#ifdef
DV22_AUX_INPUT
#define AUX_MODE 3
#else
#define AUY_MODE 3
#endif
#ifndef XXX
?
(#else)
?
#endif
8.
防止一个头文件被重复包含
由于头文
件包含可以嵌套,那么
C
文件就有可能多次包含同一个头文件,
就可能出现重复定义的问题的。
通过条件编译开关来避免重复包含(重复定义)
例如
#ifndef
__headerfileXXX__
#define
__headerfileXXX__
?
//
文件内容
?
#endif
Instances
:
1.
防止一个头文件被重复包含
#ifndef COMDEF_H
#define COMDEF_H
//
头文件内容
#endif
当你所建的工程有多个
源文件组成时,很可能会在多个文件里头包含了同一个头文件,如果借用上面的宏
定义就
能够避免同一个头文件被重复包含时进行多次编译。因为当它编译第一个头文件时总是没有定义
< br>#d
efine COMDEF_H
,那么它将编译一遍
头文件中所有的内容,包括定义
#define COMDEF_H
。这样编译再往下
进行时如果遇到同样要编译的头文件,那么由于语句
#ifndef COMDEF_H
的存在它将不再重复的编译这个头
文件。
2.
重新定
义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节
数差异,方便移植。
typedef unsigned char
boolean; /* Boolean value type. */
typedef unsigned long int uint32;
/* Unsigned 32 bit value */
typedef unsigned short uint16;
/* Unsigned 16 bit value */
typedef unsigned char uint8;
/* Unsigned 8 bit value */
typedef signed long int int32;
/* Signed 32 bit value */
typedef signed short int16;
/* Signed 16 bit value */
typedef signed char int8;
/* Signed 8 bit value */
//
下面的不建议使用
typedef unsigned char byte;
/* Unsigned 8 bit value type. */
typedef unsigned short word;
/* Unsinged 16 bit value type. */
typedef unsigned long dword;
/* Unsigned 32 bit value type. */
typedef unsigned char uint1;
/* Unsigned 8 bit value type. */
typedef unsigned short uint2;
/* Unsigned 16 bit value type. */
typedef unsigned long uint4;
/* Unsigned 32 bit value type. */
typedef signed char int1;
/* Signed 8 bit value type. */
typedef signed short int2;
/* Signed 16 bit value type. */
typedef long int int4;
/* Signed 32 bit value type. */
typedef signed long sint31;
/* Signed 32 bit value */
typedef signed short sint15;
/* Signed 16 bit value */
typedef signed char sint7;
/* Signed 8 bit value */
3.
得到指定地址上的一个字节或字
#define MEM_B( x ) ( *( (byte *) (x)
) )
#define MEM_W( x ) (
*( (word *) (x) ) )
4.
求最大值和最小值
#define MAX( x, y ) ( ((x) > (y)) ?
(x) : (y) )
#define MIN(
x, y ) ( ((x) < (y)) ? (x) : (y) )