看书小记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 的指针)。这个问题很容易解决:

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

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

2. typedef 和存储类关键字

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

typedef register int FAST_COUNTER; // 错误

编译通不过。问题出在你不能在声明中有多个存储类关键字。因为符号 typedef 已经占据了存储类关键字的位置,在 typedef 声明中不能用 register(或任何其他存储类关键字)。

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

看书小记6(《C专家编程》),布布扣,bubuko.com

时间: 2024-11-03 22:14:43

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

看书小记8(《C专家编程》)

int setjmp(jmp_buf env); void longjmp(jmp_buf env, int val); 系统跳转函数 ,可以直接在函数之间跳转 (比goto 强大多了) 将上下文 ,就是cpu和内存的信息保存到env中 ,然后调用 longjmp的时候跳转到使用env中的信息 ,恢复上下文 .如果是第一回调用setjmp 它会返回 0,如果从longjmp 跳转过来的 ,那就返回 longjmp的参数 val,根据setjmp的返回值, 我们就可以决定执行可能发生错误的代码还是

看书小记5(《C专家编程》)

函数指针 1. 函数与函数指针类型要匹配: 2. 函数指针用来保存函数首地址,即可以通过该指针访问函数: 3. 函数指针可以指向一类函数,而不是一个函数,即可以重新赋值. int maxNumber(int a, int b) { return a > b? a: b; } void fileFunc(){ cout<<"fileFunc"<<endl; } void editFunc(){ cout<<"editFunc"

看书小记9(《C专家编程》)

哈希表简单实现,练个手 #include "stdafx.h" #include <iostream> using namespace std; #define HASHSIZE 12 typedef struct HashTable { int *elem; int count; }HashTable; int m = 0; void Print(HashTable* h) { for (int i = 0; i < h->count; i++) { cout

看书小记7(《C专家编程》)

Cache是位于CPU寄存器与内存之间的存储器,它的容量比内存小但交换速度快. Cache的工作原理 1.读取顺序 当数据从内存读入时,整行的数据(16~32字节)被装入Cache,如果程序具有良好的地址引用局部性(顺序浏览一个字符串),那么CPU以后对邻近数据的引用就可以从快速的Cache读取,而不用从缓慢的内存读取.典型情况下,主存的存取速度可能只有Cache的四分之一. CPU要读取一个数据时,首先从Cache中查找,如果找到就立即读取并送给CPU处理:如果没有找到,就用相对慢的速度从内存

看书小记4(《C专家编程》)

日期与时间 struct tm { int tm_sec;     /* 秒 – 取值区间为[0,59] */ int tm_min;     /* 分 - 取值区间为[0,59] */ int tm_hour;    /* 时 - 取值区间为[0,23] */ int tm_mday;    /* 一个月中的日期 - 取值区间为[1,31] */ int tm_mon;     /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */ int tm_year;    /* 年份,

易学设计模式看书笔记(2) - 简单工厂模式

本文摘自易学设计模式一书 一.简单工厂模式 1.动物管理系统的例子 public interface Animal{ public void eat(); } public class Tiger implements Animal { public void eat(){ sysout.out.println("老虎会吃"); }; public void run(){ sysout.out.println("老虎会跑"); }; } public class D

程序员学习能力提升三要素(工作用什么,就练什么,不要在上班时间看书)

IT技术的发展日新月异,新技术层出不穷,具有良好的学习能力,能及时获取新知识.随时补充和丰富自己,已成为程序员职业发展的核心竞争力.本文中,作者结合多年的学习经验总结出了提高程序员学习能力的三个要点. 众所周知,现在是一个知识爆炸的时代,知识更新非常快.据测算,一个大学毕业生所学到的知识,在毕业之后2年内,有效的不过剩下5%.对于软件行业而言,这种形势更为明显,我们赖以立足的,不在于我们现在掌握了多少知识,而是我们有多强的学习能力. 学习人人都会,但不同的人学习效果却千差万别.一个善于学习的人,

C专家编程 Expert C Programming

该书中一些思想还是比较有用的,但随着编译器以及规范的变化,书中有些内容已经发生了变化,以下是实践之后的一些总结. 1 - typedef int x[10] 和 define x int[10]  区别 define 定义为变量替换,而typedef为声明替换; #define peach int; unsigned peach i;  //wrong typedef int banana; unsigned banana i; //wrong 声明替换用typedef 识别数组和函数指针 e.

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

最近老感觉每天不够用,每天7点起来,吃饭完了8点开始看书,不知道是我看书太慢了还是时间过得真的很快,不知不觉中午就到了.而这个时候我才看2章的内容,下午能多看3章内容.一本书也就一天的时候,而我现在还有3本最基本的书要看,还有一些工作还没有做,时间真的太快了.可能是因为我太没有计划没有目的的,有时候没有看完就留到明天看.受不了我自己.现在每天早上起来规定好计划.一定要完成才能睡觉. 今天下午工作计划:<ol> <li> 将接下来的c标准库看完,其中有标准IO库函数,数值字符串转换函