看书小记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 声明相当于普通声明:它所说明的并不是自身,而是描写叙述其它地方创建的对 ...
随机推荐
- laravel的启动过程解析
laravel的启动过程,也是laravel的核心,对这个过程有一个了解,有助于得心应手的使用框架,希望能对大家有点帮助. 统一入口 laravel框架使用了统一入口,入口文件:/public/ind ...
- NTP服务放大攻击的解决办法
什么是NTP服务? 网络时间协议NTP(Network Time Protocol)是用于互联网中时间同步的标准互联网协议.NTP服务器通过NTP服务向网络上的计算机或其他设备提供标准的授时服务,以保 ...
- SqlServer查看表、存储过程、耗时查询、当前进程、开销较大的语句
--查看数据库中表的语句 SELECT s2.dbid , DB_NAME(s2.dbid) AS [数据库名] , --s1.sql_handle , ( SELECT TOP 1 SUBSTRIN ...
- spring boot + vue + element-ui
spring boot + vue + element-ui 一.页面 1.布局 假设,我们要开发一个会员列表的页面. 首先,添加vue页面文件“src\pages\Member.vue” 参照文档h ...
- PHP编辑器分享
Sublime 1 .安装了追踪插件,ctrl+鼠标左键点击PHP函数跳到函数声明的位置. 2.已汉化 链接:http://pan.baidu.com/s/1hs5qonE 密码:b8fw 相关文章: ...
- 启动spark集群
启动Spark集群 spark@master $ ./sbin/start-all.sh 也可以一台一台启动,先启动 master spark@master $ ./sbin/start-master ...
- python selenium-webdriver 环境搭建(一)
selenium 虽然过了这么多年,但是到目前为止依然是比较流行的自动化框架了,还有很多的初学者在学习,所以根据自己的时间将把相关的资料汇总一下,下面首先我们需要搭建一下基础环境. 首先自己本身比较笨 ...
- css基础之line-height
什么是line-height(行高)?line-height设置1.5和150%有什么区别?这是一个比较常见的css面试题,带着这个问题往下看.所谓行高是指一段文字中某一行的高度吗?具体来说不是.w3 ...
- jstat命令总结
jvm统计信息监控工具 一. jstat是什么 jstat是JDK自带的一个轻量级小工具.全称"Java Virtual Machine statistics monitoring tool ...
- Scrapy 模拟登陆知乎--抓取热点话题
工具准备 在开始之前,请确保 scrpay 正确安装,手头有一款简洁而强大的浏览器, 若是你有使用 postman 那就更好了. Python 1 scrapy genspid ...