看书小记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 声明相当于普通声明:它所说明的并不是自身,而是描写叙述其它地方创建的对 ...
随机推荐
- ecplise里的run as里只有run configurations是怎么回事?
一.没有main方法 二.main方法所在的类不是在与文件名同名的类中
- Django Celery定时任务和时间设置
1.Celery加入定时任务 Celery除了可以异步执行任务之外,还可以定时执行任务.在实例代码的基础上写个测试方法: #coding:utf- from celery.task.schedules ...
- 【AtCoder】ARC101题解
C - Candles 题解 点燃的一定是连续的一段,枚举左端点即可 代码 #include <bits/stdc++.h> #define enter putchar('\n') #de ...
- VS2010中设置程序以管理员身份运行
VS2010中设置程序以管理员身份运行 直接项目右键---属性---连接器---清单文件---uac执行级别 选择requireAdministrator 重新编译 即可 这样程序直接运行就拥有管理员 ...
- Django admin 产生'WSGIRequest' object has no attribute 'user'的错误
Django admin 产生'WSGIRequest' object has no attribute 'user'的错误 django 版本1.8.升级到django2.0, Django服务 ...
- MySQL数据库引擎详解
作为Java程序员,MySQL数据库大家平时应该都没少使用吧,对MySQL数据库的引擎应该也有所了解,这篇文章就让我详细的说说MySQL数据库的Innodb和MyIASM两种引擎以及其索引结构.也来巩 ...
- 前端页面重构技巧总结TIP【持续更新...】
本文均为项目实战经验,要求兼容至IE8,所以以下内容均为兼容代码,欢迎各位小伙伴批评指教.其实重构页面是一门学问,看似简单,却暗藏很多学问.实际项目中页面的重构有以下几点最基本需求: 1.需要使用合理 ...
- 【教程】使用gitee搭建免费的图床
前几天七牛云的免费图床测试域名回收,导致我上传的图片都不能访问!要配置自定义域名,域名还要绑定主机.没有云主机的我开始想你们搞一个免费的图床,并且数据也不会丢失呢 ? 想到之前自己在GitHub上 ...
- 匿名方法和Lambda 表达式
Overview 当你使用委托的时候,有时候是否会感觉到略微有些麻烦,尽管委托已经极大的减少了我们的工作量,比如,有一个方法,只需要使用一次,仅仅是传递给委托,我们就要定义一次他,这未免太 " ...
- HTTP协议-MIME类型
每一个 URL 都代表着一个资源对象,而当我们请求一个网页的时候,看似只请求了一个 URI(统一资源标识符),实际上这个网页可能包含多个 URI,例如图片资源的 URI 和视频资源的 URI 等.此时 ...