看书小记6(《C专家编程》)
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专家编程》)的更多相关文章
- 2015-10-09 Fri 晴 加快进度看书
最近老感觉每天不够用,每天7点起来,吃饭完了8点开始看书,不知道是我看书太慢了还是时间过得真的很快,不知不觉中午就到了.而这个时候我才看2章的内容,下午能多看3章内容.一本书也就一天的时候,而我现在还 ...
- 到底怎么样才叫看书?——Tony Zhao's
到底怎么样才叫看书?——上篇 目录: 一.引入 二.经历了就能理解 三.读书要分级 四.只读经典 五.别吝惜你动笔的那点时间 一.引入 看到这个题目的时候你可能会感到有点好笑:“这还用问,看书就是把书 ...
- 《大象UML》看书笔记2:
<大象UML>看书笔记2 抽象角度: 在为现实世界建模的时候,首先要搞清楚有多 ...
- C专家编程阅读笔记
周末闲来无事,(哗),好久之前买的C专家编程一直没看,翻起来看了一下 尽量不使用unsigned 尽量不要在代码中使用unsigned,尤其是一些看起来是无符号类型的数字,比如年龄等,因为难免要使用u ...
- c专家编程摘录
C专家编程摘录 c操作符的优先级 有时一些c操作符有时并不会像你想象的那样工作. 下方表格将说明这个问题: 优先级问题 表达式 期望的情况 实际情况 . 优先级高于* *p.f (*p).f *(p. ...
- <<c专家编程>>笔记
C专家编程摘录 c操作符的优先级 有时一些c操作符有时并不会像你想象的那样工作. 下方表格将说明这个问题: 优先级问题 表达式 期望的情况 实际情况 . 优先级高于* *p.f (*p).f *(p. ...
- 一款纯css3实现的机器人看书动画效果
今天要给大家介绍一款纯css3实现的机器人看书动画效果.整个画面完全由css3实现的绘制,没有使用任何图片元素.机器人的眼睛使用了动画元素.我们一起看下效果图: 在线预览 源码下载 实现的代码. ...
- Tony zhao:到底怎么样才叫看书?
http://blog.jobbole.com/25842/ 目录: 一.引入 二.经历了就能理解 三.读书要分级 四.只读经典 五.别吝惜你动笔的那点时间 一.引入 看到这个题目的时候你可能会感到有 ...
- 《C专家编程》数组和指针并不同--多维数组
<C专家编程>数组和指针并不同 标签(空格分隔): 程序设计论著笔记 1. 背景理解 1.1 区分定义与声明 p83 声明相当于普通声明:它所说明的并不是自身,而是描写叙述其它地方创建的对 ...
随机推荐
- Linux屏幕记录命令script
Script -a action.log –t 2> time.log按ctrl+d 退出录制回访 scriptreplay time.log action.log或者直接用查看命令cat,ta ...
- laravel 辅助函数
数组&对象 1.array_divide() array_divide 函数返回两个数组,一个包含原始数组的健,另一个包含原始数组的值 [$keys, $values] = array_div ...
- MySQL多线程备份工具mydumper
mydumper是一个针对MySQL和Drizzle的高性能多线程的备份和恢复工具.此工具的开发人员分别来自MySQL.Fackbook.SkySQL公司,目前已经有一些大型产品业务测试并使用了该工具 ...
- MVC母板页传递数据
问题:判断Session 失败 结果: if (Session[SessionKey.AccountInfo] != null) { ViewData["AdminUser"] = ...
- 【转载】Java与C++语言在作用域上的差异浅析
http://developer.51cto.com/art/200906/126199.htm 差异一:变量作用域的不同 如下面这段程序代码是符合C++语言的语法要求的.其可以在C语言下正常运行.但 ...
- 前端架构之路:Windows下安装Nodejs步骤
最近打算把我们的微信端用Vue.js重构,为什么选择Vue.js,一是之前使用的是传统的asp.net mvc,多页面应用用户体验比单页面要差.二是使用过Angular.js,感觉对开发人员要求较 ...
- webstorm减少内存占用
首先,按照我说的设置之后要重启才行. 在项目里找到不需要监听的文件夹右键:Mark Directory As => Cancel Exclusion 然后重启,嘿嘿,成功了!
- bzoj 1190
思路:分层dp,因为给的w都是a*(2 ^ b)的形式, 我们将这些物品按b分层, 我们设 dp[ i ][ j ]表示在 第 i 层 容量为(j << i)的最大值, 然后通过层与层之间 ...
- 000 Jquery的Hello World程序
1.介绍Jquery 2.简介 3.新建一个静态项目,并粘贴jquery库 4.程序 <!DOCTYPE html> <html> <head> <meta ...
- 浅谈Spring的AOP实现-代理机制
说起Spring的AOP(Aspect-Oriented Programming)面向切面编程大家都很熟悉(Spring不是这次博文的重点),但是我先提出几个问题,看看同学们是否了解,如果了解的话可以 ...