注意:C语言里面没有bool(布尔)类型,C++里面才引入bool类型,C语言里面用数值0表示假,非0整数表示真(一般是1)
除了可以直接使用C标准类型名(char
、short
、int
、long
、float
、double
) 和开发者自己声明的struct
、union
、enum
类型外,还可以使用typedef
来给这些已有的类型名取一个别名
, 然后我们就使用这个别名
。为什么要这么做呢?通常基于下面这些原因:
比如整型
分为了4
种类型:short
、int
、long
、long long
, 标准并没有规定这些数据类型到底占用多少内存空间,只是规定了sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
, 具体占用多少内存空间由编译器
决定。所以,为了便于移植程序,我们可以结合条件编译
来定义统一的数据类型,示例:
#if __LP64__ || 0 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
在定义struct
、union
、enum
等的时候,如果不使用typedef
的话,我们总是要带上struct
、union
、enum
等关键字,与基本类型的使用不统一,总显得格格不入, 使用typedef
后就不用带上这些关键字了。
不使用typedef
定义复杂类型示例:
struct Person {
char name[10];
int age;
char sex;
};
union XX {
int x;
char y;
};
enum bool {
false,
true
};
int main() {
struct Person person = {.name = "lifupin", .age = 18, .sex = 'F'};
union XX xx;
xx.x = 1;
enum bool isOK = false;
return 0;
}
使用typedef
定义复杂类型示例:
typedef struct {
char name[10];
int age;
char sex;
} Person;
typedef union {
int x;
char y;
} XX;
typedef enum {
false,
true
} bool;
int main() {
Person person = {.name = "lifupin", .age = 18, .sex = 'F'};
XX xx;
xx.x = 1;
bool isOK = false;
return 0;
}
在C
语言的语法中,没有String
类型,我们通常用字符指针
代表String
类型,用String
更妥当。
typedef char* String;
String str = "Hello";
示例:
#include<stdio.h>
typedef void (*Callback)(int);
void callback(int x) {
printf("x = %d\n", x);
}
int main() {
Callback cb = callback;
cb(2);
return 0;
}
注意:
typedef
只是对已经存在的数据类型
设置一个别名
,而没有创造新的数据类型
。
typedef
与#define
有相似之处,但事实上二者是不同的,#define
是在预编译时处理,它只能做简单的字符串替换, 而typedef
是在编译时处理的。它并不是做简单的字符串替换,而是采用如同定义变量的方法那样来声明一个类型。
例如:typedef int COUNT;
和#define COUNT int
的作用都是用COUNT
代表int
, 但事实上它们二者是不同的。