我想知道在c中typedef
和#define
是否相同
发布于 2009-11-03 17:59:29
不是的。
#define
是一个预处理器令牌:编译器本身永远看不到它。
typedef
是一个编译器标记:预处理器并不关心它。
您可以使用其中一种或另一种来达到相同的效果,但最好根据需要使用适当的一种
#define MY_TYPE int
typedef int My_Type;
当事情变得“乱七八糟”时,使用适当的工具可以让它变得正确
#define FX_TYPE void (*)(int)
typedef void (*stdfx)(int);
void fx_typ(stdfx fx); /* ok */
void fx_def(FX_TYPE fx); /* error */
发布于 2009-11-03 18:03:06
typedef
与变量一样遵循作用域规则,而define
在编译单元结束(或匹配的undef
)之前一直有效。
此外,一些不能用define
完成的事情可以用typedef
完成。
例如:
typedef int* int_p1;
int_p1 a, b, c; // a, b, c are all int pointers
#define int_p2 int*
int_p2 a, b, c; // only the first is a pointer, because int_p2
// is replaced with int*, producing: int* a, b, c
// which should be read as: int *a, b, c
typedef int a10[10];
a10 a, b, c; // create three 10-int arrays
typedef int (*func_p) (int);
func_p fp; // func_p is a pointer to a function that
// takes an int and returns an int
发布于 2009-11-03 23:52:50
不,它们是不一样的。例如:
#define INTPTR int*
...
INTPTR a, b;
在预处理之后,该行扩展为
int* a, b;
希望您能看到问题所在;只有a
将具有类型int *
;b
将被声明为普通的int
(因为*
与声明符相关联,而不是与类型说明符相关联)。
与此形成对比
typedef int *INTPTR;
...
INTPTR a, b;
在本例中,a
和b
的类型都是int *
。
有一些完整的typedefs类是不能用预处理器宏来模拟的,比如指向函数或数组的指针:
typedef int (*CALLBACK)(void);
typedef int *(*(*OBNOXIOUSFUNC)(void))[20];
...
CALLBACK aCallbackFunc; // aCallbackFunc is a pointer to a function
// returning int
OBNOXIOUSFUNC anObnoxiousFunc; // anObnoxiousFunc is a pointer to a function
// returning a pointer to a 20-element array
// of pointers to int
尝试使用预处理器宏来实现这一点。
https://stackoverflow.com/questions/1666353
复制相似问题