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
希望您能够看到这个问题; 只有 a具有 int *类型; b将被声明为纯 int(因为 *与声明器相关联,而不是与类型说明符相关联)。
对比一下
typedef int *INTPTR;
...
INTPTR a, b;
在这种情况下,a和 b都将具有 int *类型。
有许多 typedef 类型不能用预处理器宏来模拟,例如指向函数或数组的指针:
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
#define defType int
typedef int tdType
defType x;
tdType y;
在这里,编译器将变量 x 视为 int,而将变量 y 视为名为“ tdType”的数据类型,其大小恰好与 int 相同。如果您编写的函数采用 defType 类型的参数,那么调用方可以传递一个普通的 int,而编译器不会知道其中的差异。如果函数采用 tdType 类型的参数,编译器将确保在函数调用期间使用适当类型的变量。