热门搜索 :
考研考公
您的当前位置:首页正文

typedef的用法

来源:伴沃教育
typedef

【用途】

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 using namespace std;

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 using namespace std;

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 using namespace std;

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 using namespace std;

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; 这样才能正常执行。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top