typedef 详解
一行很常用的代码:
typedef int XX_Size_Check[(sizeof(XX)==64)? 1:-1];
很容易猜到上面这行代码是要在编译时检查XX的size,但再深究点,我们就会发现它跟我们平时typedef的写法不太一致。
typedef用法小结
对已有类型定义别名
typedef <old type name> <new alias>;
这是最常见的写法,主要用途有
- 结构体
举个例子,我们这里定义了一个结构体MyStruct,在C里面,如果要定义该类型的变量,则需要写struct关键字。(C++里在不产生歧义的情况下可以省略。)
struct MyStruct {
int data1;
char data2;
};
struct MyStruct a;
我们可以使用typedef来简化书写:
typedef struct MyStruct newtype;
newtype a;
当然也可以直接写成这样:
typedef struct MyStruct {
int data1;
char data2;
} newtype;
或者更简单的:
typedef struct {
int data1;
char data2;
} newtype;
- 指针
typedef struct Node* NodePtr;
...
NodePtr startptr, endptr, curptr, prevptr, errptr, refptr;
函数指针
不使用typedef,我们会这样写:
int do_math(float arg1, int arg2) {
return arg2;
}
int call_a_func(int (*call_this)(float, int)) {
int output = call_this(5.5, 7);
return output;
}
int final_result = call_a_func(&do_math);
使用typedef:
typedef int (*MathFunc)(float, int);
int do_math(float arg1, int arg2) {
return arg2;
}
int call_a_func(MathFunc call_this) {
int output = call_this(5.5, 7);
return output;
}
int final_result = call_a_func(&do_math);
这里typedef后面跟了一个函数指针类型 int (*MathFunc)(float, int),通过这个语句,MathFunc成为该函数指针类型的别名。
数组
typedef int vector[10];
vector a;
a[9] = 100;
和函数指针比较类似,typedef后面跟了一个数组类型(元素类型为int,数组长度为10),通过这个语句,vector成为该数组类型的别名。
也可以定义多维数组。