typedef不常见但值得一提的用途:

1. 用typedef来定义与平台无关的类型。

比方定义一个叫 REAL 的浮点类型。在目标平台一上。让它表示最高精度的类型为:

typedef long double REAL; 

在不支持 long double 的平台二上,改为:

typedef double REAL; 

在连 double 都不支持的平台三上,改为:

typedef float REAL; 

也就是说,当跨平台时,仅仅要改下 typedef 本身即可,不用对其它源代码做不论什么改动。

标准库就广泛使用了这个技巧。比方size_t。

另外,由于typedef是定义了一种类型的新别名。不是简单的字符串替换。

2.为复杂的声明定义一个新的简单的别名。

方法是:在原来的声明里逐步用别名替换一部分复杂声明,如此循环。把带变量名的部分留到最后替换。得到的就是原声明的最简化版。

举例:

(1). 原声明:int *(*a[5])(int, char*);

变量名为a,直接用一个新别名pFun替换a就能够了:

typedef int *(*pFun)(int, char*); 

原声明的最简化版:

pFun a[5];

(2). 原声明:void (*b[10]) (void (*)());

变量名为b。先替换右边部分括号中的,pFunParam为别名一:

typedef void (*pFunParam)();

再替换左边的变量b,pFunx为别名二:

typedef void (*pFunx)(pFunParam);

原声明的最简化版:

pFunx b[10];

(3). 原声明:doube(*)() (*e)[9]; 

变量名为e,先替换左边部分。pFuny为别名一:

typedef double(*pFuny)();

再替换右边的变量e。pFunParamy为别名二

typedef pFuny (*pFunParamy)[9];

原声明的最简化版:

pFunParamy e;

理解复杂声明举例:

int (*func)(int *p);

func是一个函数指针,这类函数具有int*类型的形參,返回值类型是int。

int (*func[5])(int *);

func右边是一个[]运算符,说明func是具有5个元素的数组;func的左边有一个*。说明func的元素是指针(注意这里的*不是修饰func,而是修饰func[5]的,原因是[]运算符优先级比*高。func先跟[]结合)。跳出这个括号。看右边,又遇到圆括号,说明func数组的元素是函数指针,它指向的函数具有int*类型的形參。返回值类型为int。

记住2个模式:

type (*)(....)-->函数指针 

type (*)[]    -->数组指针

其它:

1. typedef char * pStr;

char string[4] = "abc";

const char *p1 = string;

const pStr p2 = string;

p1++;

//p2++;

p2++编译出错。

typedef和#define不同,它不是简单的文本替换。上述代码中const pStr p2并不等于const char * p2。const pStr p2和const long x本质上没有差别,都是对变量进行仅仅读限制,仅仅只是此处变量p2的数据类型是我们自定义的而不是系统固有类型而已。因此,const pStr p2的含义是:限定数据类型为char *的变量p2为仅仅读,因此p2++错误。

依照顺序。‘const pstr’被解释为‘char * const’(一个指向 char 的常量指针),而不是‘const char *’(指向常量 char 的指针)。这个问题非常easy解决:

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

记住:无论什么时候。仅仅要为指针声明 typedef,那么都要在终于的 typedef 名称中加一个 const,以使得该指针本身是常量,而不是对象。

2. typedef 和存储类keyword

  typedef 就像 auto,extern,mutable。static,和 register 一样,是一个存储类keyword。这并非说 typedef 会真正影响对象的存储特性,仅仅是在语句构成上,typedef 声明看起来象 static,extern 等类型的变量声明。以下将带到第二个陷阱:

typedef register int FAST_COUNTER; // 错误

编译通只是。问题出在你不能在声明中有多个存储类keyword。由于符号 typedef 已经占领了存储类keyword的位置。在 typedef 声明中不能用 register(或不论什么其它存储类keyword)。

參考链接:http://www.ourlove520.com/Programming/vc/201404/242796.html

看书小记6(《C专家编程》)的更多相关文章

  1. 2015-10-09 Fri 晴 加快进度看书

    最近老感觉每天不够用,每天7点起来,吃饭完了8点开始看书,不知道是我看书太慢了还是时间过得真的很快,不知不觉中午就到了.而这个时候我才看2章的内容,下午能多看3章内容.一本书也就一天的时候,而我现在还 ...

  2. 到底怎么样才叫看书?——Tony Zhao's

    到底怎么样才叫看书?——上篇 目录: 一.引入 二.经历了就能理解 三.读书要分级 四.只读经典 五.别吝惜你动笔的那点时间 一.引入 看到这个题目的时候你可能会感到有点好笑:“这还用问,看书就是把书 ...

  3. 《大象UML》看书笔记2:

    <大象UML>看书笔记2 抽象角度:                                                        在为现实世界建模的时候,首先要搞清楚有多 ...

  4. C专家编程阅读笔记

    周末闲来无事,(哗),好久之前买的C专家编程一直没看,翻起来看了一下 尽量不使用unsigned 尽量不要在代码中使用unsigned,尤其是一些看起来是无符号类型的数字,比如年龄等,因为难免要使用u ...

  5. c专家编程摘录

    C专家编程摘录 c操作符的优先级 有时一些c操作符有时并不会像你想象的那样工作. 下方表格将说明这个问题: 优先级问题 表达式 期望的情况 实际情况 . 优先级高于* *p.f (*p).f *(p. ...

  6. <<c专家编程>>笔记

    C专家编程摘录 c操作符的优先级 有时一些c操作符有时并不会像你想象的那样工作. 下方表格将说明这个问题: 优先级问题 表达式 期望的情况 实际情况 . 优先级高于* *p.f (*p).f *(p. ...

  7. 一款纯css3实现的机器人看书动画效果

    今天要给大家介绍一款纯css3实现的机器人看书动画效果.整个画面完全由css3实现的绘制,没有使用任何图片元素.机器人的眼睛使用了动画元素.我们一起看下效果图: 在线预览   源码下载 实现的代码. ...

  8. Tony zhao:到底怎么样才叫看书?

    http://blog.jobbole.com/25842/ 目录: 一.引入 二.经历了就能理解 三.读书要分级 四.只读经典 五.别吝惜你动笔的那点时间 一.引入 看到这个题目的时候你可能会感到有 ...

  9. 《C专家编程》数组和指针并不同--多维数组

    <C专家编程>数组和指针并不同 标签(空格分隔): 程序设计论著笔记 1. 背景理解 1.1 区分定义与声明 p83 声明相当于普通声明:它所说明的并不是自身,而是描写叙述其它地方创建的对 ...

随机推荐

  1. Java 在方法和作用域内的内部类

    通常,如果所读写 的代码包含了内部类,那么它们都是"平凡的"内部类,简单并且容易理解,然而,内部类的语法覆盖了大量其它的更加难以理解的计数,例如可以在一个方法里或者在任意的作用域里 ...

  2. jenkins安装及环境搭建

    Jenkins 是基于Java开发的一种持续集成工具,所以,Jenkins需要Java环境. Jenkins版本是: JAVA版本是: Tomcat版本是: 或者 Jenkins版本是:2.10.2 ...

  3. Asp.Net Core WebAPI入门整理(一)

    一.Asp.Net Core  WebAPI 1.目前版本是v1.1 2.默认路由处理和Asp.Net WebAPI有些 区别了,现在使用的是控制器路由[Route("api/Menu&qu ...

  4. APP性能测试开始之旅

    你是不是也跟我一样在工作中存在着同样的问题,APP版本在上线后不断的会有市场人员或者用户反馈页面加载慢,进入页面loading很久(实际我们设置的加载超时是15秒,15秒内加载出内容则显示,15秒外未 ...

  5. Serilog 记录日志

    Serilog 记录日志 Serilog是.net里面非常不错的记录日志的库,另外一个我认为比较好的Log库是NLog. 在我个人的asp.net web api 2 基础框架(Github地址)里, ...

  6. 9-2 The Tower of Babylon uva437 (DP)

    题意:有n种立方体 每种都有无穷多个 要求选一些立方体叠成一根尽量高的柱子  (可以自行选择哪条边为高 )使得每个立方体的底面都严格小于他下方的立方体 为DAG模型 在任何时候 只有顶面的尺寸会影响到 ...

  7. CSS选择器优先级(转)

    原文:http://www.cnblogs.com/wangfupeng1988/p/4285251.html 另外,w3c有文章介绍了CSS选择器的特定性,见https://www.w3.org/T ...

  8. ajax和302(转)

    原文:http://www.cnblogs.com/dudu/p/ajax_302_found.html 在ajax请求中,如果服务器端的响应是302 Found,在ajax的回调函数中能够获取这个状 ...

  9. 007.KVM虚机时间-快照管理

    一 快照管理 1.1 创建快照 [root@kvm-host ~]# virsh snapshot-create vm03-centos6.8 [root@kvm-host ~]# virsh sna ...

  10. 探索Java的日志世界

    探索Java的日志世界 本文的思维导图 一.主题 打开日志的大门,探索的Java日志世界 二.目标 了解常用的日志框架 掌握日志框架的选择和使用以及开发规范 了解日志框架中的一些设计思想 三.内容 1 ...