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