【用途】
typedef 是关键字,可用它来为类型取一个新的名字。 【目的】
一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。
【用法】
变量声明表达式 等同于
typedef 声明表达式;
/*此语句中声明表达式中的变量名用所取的新的类型名字替代即可,其它的与常规的声明表达式一致*/
新类型名变量名;
【示例】
eg1:普通变量
typedef unsigned char BYTE; BYTE b1, b2; 等同于
unsigned char b1; unsigned char b2;
eg2:结构体
typedef struct Books {
char title[50]; char author[50]; char subject[100]; int book_id; } Book; Book book; 等同于 struct Books {
char title[50]; char author[50]; char subject[100]; int book_id; } book;
Eg3:函数
#include typedef int asw(int d, int w); asw cfunction; int main() { int a, b; cin >> a; cin >> b; cout << \"a+b=\" << cfunction(a, b); return 0; } int cfunction(int d, int w) { int cww; cww = d + w; return cww; } 等同于 #include int cfunction2(int d, int w) { int cww; cww = d + w; return cww; } int main() { int a, b; cin >> a; cin >> b; cout << \"a+b=\" << cfunction2(a, b); return 0; } 【关键】 1) C中结构体定义 typedef struct Books { char title[50]; char author[50]; char subject[100]; int book_id; } Book; Book book; 等同于 struct Books { char title[50]; char author[50]; char subject[100]; int book_id; } book; 2) 隐藏数组语法 char line[81]; char text[81]; 等同于 typedef char Line[81]; Line text,line; 3) 隐藏指针语法 typedef char* pstr; pstr p1; 等同于 char *p1; 4) 作用域 typedef char FlagType; int main() { } void myproc( int ) { int FlagType; } 在声明局部范围标识符的名称和 typedef 相同时,被重载 5) 用于常量 typedef char FlagType; const FlagType x; 正确 const FlagType错误 6) 用于函数 正确的 #include typedef int asw(int d, int w); asw cfunction2; int main() { int a, b; cin >> a; cin >> b; cout << \"a+b=\" << cfunction2(a, b); return 0; } int cfunction2(int d, int w) { int cww; cww = d + w; return cww; } 错误的 #include typedef int asw(int d, int w); asw cfunction2(int d, int w); { int cww; cww = d + w; return cww; } int main() { int a, b; cin >> a; cin >> b; cout << \"a+b=\" << cfunction2(a, b); return 0; } 7) 常指针 typedef char* pstr; int mystrcmp(const pstr p1,const pstr p3); 用GNU的gcc和g++编译器,是会出现警告的,按照顺序,‘const pstr'被解释为‘char* const‘(一个指向char的指针常量),而事实上,const char*和char* const表达的并非同一意思(详见C++ Primer 第四版 P112)。 char * const cp : 定义一个指向字符的指针常数,即const指针,常指针。 const char* p : 定义一个指向字符常数的指针,即常量指针。 char const* p : 等同于const char* p。 为了得到正确的类型,应当如下声明: typedef const char* pstr; 8) 声明顺序问题 错误的 typedef struct tagNode { char* pItem; pNode pNext; }*pNode; 新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNode。 正确的 1) typedef struct tagNode { char* pItem; struct tagNode* pNext; }*pNode; 2) typedef struct tagNode pNode; struct tagNode { char* pItem; pNode* pNext; }; 3) struct tagNode { char* pItem; struct tagNode* pNext; }; typedef struct tagNode pNode; 9) typedef vs #define #define 是 C 指令,用于为各种数据类型定义别名,与 typedef 类似,但是它们有以下几点不同: typedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名,比如您可以定义 1 为 ONE。 typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。 #include #define TRUE 1 #define FALSE 0 int main( ) { printf( \"Value of TRUE : %d\\n\ printf( \"Value of FALSE : %d\\n\ return 0; } 执行后 Value of TRUE : 1 Value of FALSE : 0 typedef char* pStr1; #define pStr2 char* pStr1 s1,s2; pStr2 s3,s4; 在上述的变量定义中,s1、s2、s3都被定义为char *,而s4则定义成了char,不是我们所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。 上例中define语句必须写成 pStr2 s3, *s4; 这样才能正常执行。 因篇幅问题不能全部显示,请点此查看更多更全内容