1. typedef 最简单使用

  1.  typedef long byte_4; // 给已知数据类型long起个新名字,叫byte_4  

你可以在任何需要 long 的上下文中使用 byte_4。注意 typedef 并不创建新的类型。它仅仅为现有类型添加一个同义字。

2. typedef 修饰数组

 typedef char mySizes[];
mySizes xxx; typedef char [] mySizes; //error

这里 mySize 就是一个大小为100的 char 数组,sizeof(mySize) 为 100。

3. typedef 修饰指针

 typedef char * pstr;
int mystrcmp(pstr, pstr);
......
int mystrcmp(const pstr, const pstr); //error

这里有一个 typedef 陷阱。标准函数 strcmp()有两个‘const char *’类型的参数。因此,它可能会误导人们象上面这样声明。

按照顺序,‘const pstr’被解释为‘char * const’(一个指向 char 的常量指针),而不是‘const char *’(指向常量 char 的指针)。

其实这点很好理解,const 就是修饰 pstr 指针的,并不是简单替换。

这个问题很容易解决:

 typedef const char * cpstr;
int mystrcmp(cpstr, cpstr); // 现在是正确的

4. typedef 修饰结构体

 typedef struct tagMyStruct   
{
int iNum;   
long lLength;   
} MyStruct;

这语句实际上完成两个操作:
(1).定义一个新的结构类型

 struct tagMyStruct   
{   
int iNum;   
long lLength;   
};   
 

分析:

tagMyStruct ,实际上是一个临时名字,struct 关键字和 tagMyStruct一起,构成了这个结构类型,不论是否有typedef,这个结构都存在。

我们可以用 struct tagMyStruct xxName 来定义变量,但要注意,使用tagMyStruct xxxrName 来定义变量是不对的,因为struct 和tagMyStruct合在一起才能表示一个结构类型。

(2). typedef 为这个新的结构起了一个名字,叫 MyStruct。

typedef struct tagMyStruct MyStruct;因此,MyStruct实际上相当于struct  tagMyStruct,我们可以使用MyStruct varName来定义变量。

5. typedef & 结构的问题

在结构中包含指向它自己的指针

 typedef struct tagNode   
{   
char *pItem;   
pNode pNext; // error  
} *pNode;
 

答案与分析: 
    根据我们上面的阐述可以知道:要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字 pNoed 也还不存在,也就是说这个时候编译器根本不认识pNode。

解决这个问题的方法有多种:

 // 1)
typedef struct tagNode   
{
char *pItem;
struct tagNode *pNext;   
} *pNode;    // 2)   
typedef struct tagNode* pNode;   
struct tagNode   
{
char *pItem;
pNode pNext;
};
//注意:在这个例子中,你用 typedef 给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。 // 3)规范做法:   
struct tagNode   
{
char *pItem;
struct tagNode *pNext;   
};
typedef struct tagNode *pNode;
 

6. typedef 与 #define的问题
有下面两种定义pStr数据类型的方法,两者有什么不同?哪一种更好一点?

 typedef char* pStr;   
#define pStr char*;   

答案与分析:

通常讲,typedef要比#define要好,特别是在有指针的场合。
请看例子:

 typedef char* pStr1;
#define pStr2 char *
pStr1 s1, s2; // char* s1; char* s2; 
pStr2 s3, s4; // char* s3, s4;即 char s4;
 

在上述的变量定义中,s4则定义成了char,不是我们所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。

上例中define语句必须写成 pStr2 s3, *s4; 这这样才能正常执行。

7. typedef 与 复杂的变量声明

在编程实践中,尤其是看别人代码的时候,常常会遇到比较复杂的变量声明,使用typedef作简化自有其价值,比如:   
下面是三个变量的声明,我想使用typdef分别给它们定义一个别名,请问该如何做?

 int *(*a[])(int, char*);

 void (*b[]) (void (*)());

 double(*)() (*pa)[]; 

答案与分析:

对复杂变量建立一个类型别名的方法很简单,你只要在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头就行了。

8. typedef 修饰函数指针

 //1. 定义一个函数指针
typedef int(_cdecl *FUN_Start)(UCHAR);
/* typedef的功能是定义新的类型。定义这种类型为指向某种函数的指针,这函数以一个UCHAO为参数并返回int类型。*/ //2. 定义这个函数指针的一个变量
FUN_Start fun_Start; //3. 把函数的地址赋给此函数指针
fun_Start = (FUN_Start)GetProcAddress(m_hLibrary,"Rec_SetDevice"); //4. 调用
if (fun_Start('a') == ) //直接通过函数指针调用
{......} //当然也可以这样
if ( (*)fun_Start('a') == ) //先用*fun_start取出它所指的函数类型,再调用
{......}

因为函数名就是一个地址,该函数名所代表的函数的入口地址。

ref:http://blog.csdn.net/lwbeyond/article/details/6191942

c/c++中typedef详解的更多相关文章

  1. winxp计算机管理中服务详解

    winxp计算机管理中服务详解01 http://blog.sina.com.cn/s/blog_60f923b50100efy9.html http://blog.sina.com.cn/s/blo ...

  2. cocos2dx常见的46中+22中动作详解

    cocos2dx常见的46中+22中动作详解 分类: iOS2013-10-16 00:44 1429人阅读 评论(0) 收藏 举报 bool HelloWorld::init(){    ///// ...

  3. Android中Context详解 ---- 你所不知道的Context

    转自:http://blog.csdn.net/qinjuning/article/details/7310620Android中Context详解 ---- 你所不知道的Context 大家好,  ...

  4. iOS中-Qutarz2D详解及使用

    在iOS中Qutarz2D 详解及使用 (一)初识 介绍 Quartz 2D是二维绘图引擎. 能完成的工作有: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成 ...

  5. 【转】declare-styleable的使用(自定义控件) 以及declare-styleable中format详解

    原文网址:http://www.cnblogs.com/622698abc/p/3348692.html declare-styleable是给自定义控件添加自定义属性用的 1.首先,先写attrs. ...

  6. Python中dict详解

    from:http://www.cnblogs.com/yangyongzhi/archive/2012/09/17/2688326.html Python中dict详解 python3.0以上,pr ...

  7. 【转】 java中HashMap详解

    原文网址:http://blog.csdn.net/caihaijiang/article/details/6280251 java中HashMap详解 HashMap 和 HashSet 是 Jav ...

  8. java中HashMap详解(转)

    java中HashMap详解 博客分类: JavaSE Java算法JDK编程生活       HashMap 和 HashSet 是 Java Collection Framework 的两个重要成 ...

  9. java集合(2)- java中HashMap详解

    java中HashMap详解 基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了非同步和允许使用 null 之外,HashMap 类与 H ...

随机推荐

  1. Loadrunner11.00破解方法

    1.下载 从http://www.jb51.net/softs/71240.html上面下载到loadrunner 11.0 2.安装loadrunner 11.0 下载之后,我是直接解压到硬盘,再安 ...

  2. Swift——(三)Swift神奇的下划线

    在Swift在.有许多神奇的下划线,在这里,我们将看到神奇的汇总,我希望能够帮助其他很多学习Swift朋友. @Author: twlkyao转载或者引用请保留此行. 1.格式化数字字面量     通 ...

  3. hdu5044 Tree 树链拆分,点细分,刚,非递归版本

    hdu5044 Tree 树链拆分.点细分.刚,非递归版本 //#pragma warning (disable: 4786) //#pragma comment (linker, "/ST ...

  4. jsp页面onsubmit="return checklogin();"该解决方案给

    选择Window->Preferences->MyEclipse->Validation 去掉方框里的对号,然后Apply 然后点击Yes->然后再点击ok->Yes,足 ...

  5. int 价值型追记-time

    一个 30 M 的int号码值一次性保存.和读取一次,避免保存为char 种类,进行格转变,格转换时间是非常耗时. #include <iostream> #include <fst ...

  6. vim_编码配置文件_utf8乱码解决

    1:简化步奏 调整 :vimrc的脚本配置 编辑~/.vimrc文件,(没有的话新建个)加上如下几行: set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb23 ...

  7. Mac+PhpStorm+XAMPP+Xdebug

    Mac+PhpStorm+XAMPP+Xdebug 环境的配置   在上一篇 PHP 系列的文章<PHP 集成开发环境比较>中,我根据自己的亲身体验,非常简略的介绍和对比了几款常用的集成开 ...

  8. Cocos2d-x之MenuItem

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  9. TRIZ系列-创新原理-28-替代机械系统原理

    替代机械系统原理的详细描写叙述例如以下:1)用光.声.热.嗅觉系统替代机械系统:2)用电.磁或电磁场来与物体交互作用:3)用移动场替代精巧场,用随时间变化的场替代固定场,用结构化的场替代随机场:4)使 ...

  10. Coreseek:索引和检测的第二步骤施工

    1,非常索引easy,代码行 g:/service/coreseek/bin/indexer -c g:/service/coreseek/etc/csft_mysql.conf   person 在 ...