使用 typedef 抑制劣质代码

2016-01-29 12:26 5 1 收藏

使用 typedef 抑制劣质代码,使用 typedef 抑制劣质代码

【 tulaoshi.com - C语言心得技巧 】

使用 typedef 抑制劣质代码

作者:Danny Kalev
编译:MTT 工作室

原文出处:Using typedef to Curb Miscreant Code

摘要:Typedef 声明有助于创建平台无关类型,甚至能隐藏复杂和难以理解的语法。不管怎样,使用 typedef 能为代码带来意想不到的好处,通过本文你可以学习用 typedef 避免缺欠,从而使代码更健壮。

  typedef 声明,简称 typedef,为现有类型创建一个新的名字。比如人们常常使用 typedef 来编写更美观和可读的代码。所谓美观,意指 typedef 能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。本文下面将竭尽全力来揭示 typedef 强大功能以及如何避免一些常见的陷阱。

如何创建平台无关的数据类型,隐藏笨拙且难以理解的语法?
 
使用 typedefs 为现有类型创建同义字。

定义易于记忆的类型名
  typedef 使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。类型出现在所声明的变量名字中,位于 ''typedef'' 关键字右边。例如:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)
typedef int size;

  此声明定义了一个 int 的同义字,名字为 size。注意 typedef 并不创建新的类型。它仅仅为现有类型添加一个同义字。你可以在任何需要 int 的上下文中使用 size:

void measure(size * psz); size array[4];size len = file.getlength();std::vector <size vs; 

  typedef 还可以掩饰符合类型,如指针和数组。例如,你不用象下面这样重复定义有 81 个字符元素的数组:

char line[81];char text[81];

定义一个 typedef,每当要用到相同类型和大小的数组时,可以这样:

typedef char Line[81]; Line text, secondline;getline(text);

同样,可以象下面这样隐藏指针语法:

typedef char * pstr;int mystrcmp(pstr, pstr);

  这里将带我们到达第一个 typedef 陷阱。标准函数 strcmp()有两个‘const char *’类型的参数。因此,它可能会误导人们象下面这样声明 mystrcmp():

int mystrcmp(const pstr, const pstr); 

  这是错误的,按照顺序,‘const pstr’被解释为‘char * const’(一个指向 char 的常量指针),而不是‘const char *’(指向常量 char 的指针)。这个问题很容易解决:

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

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

代码简化
  上面讨论的 typedef 行为有点像 #define 宏,用其实际类型替代同义字。不同点是 typedef 在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换。例如:

typedef int (*PF) (const char *, const char *);

  这个声明引入了 PF 类型作为函数指针的同义字,该函数有两个 const char * 类型的参数以及一个 int 类型的返回值。如果要使用下列形式的函数声明,那么上述这个 typedef 是不可或缺的:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)
PF Register(PF pf);

  Register() 的参数是一个 PF 类型的回调函数,返回某个函数的地址,其署名与先前注册的名字相同。做一次深呼吸。下面我展示一下如果不用 typedef,我们是如何实现这个声明的:

int (*Register (int (*pf)(const char *, const char *))) (const char *, const char *); 

  很少有程序员理解它是什么意思,更不用说这种费解的代码所带来的出错风险了。显然,这里使用 typedef 不是一种特权,而是一种必需。持怀疑态度的人可能会问:“OK,有人还会写这样的代码吗?”,快速浏览一下揭示 signal()函数的头文件 <csinal,一个有同样接口的函数。

typedef 和存储类关键字(storage class sp

来源:http://www.tulaoshi.com/n/20160129/1486063.html

延伸阅读
如何区别优劣质奶粉? 奶粉的种类很多,价格相差也很多,对宝宝来说,哪种奶粉才是最适合的呢?先了解一下市场上奶粉的种类吧。 奶粉的分类 全脂奶粉:它基本保持了牛奶的营养成分,适用于全体消费者。但最适合于中青年消费者。 脱脂乳粉:牛奶脱脂后加工而成,口味较淡,适于中老年、肥胖和不适于摄入脂肪的消费者。 速溶奶粉:和全脂奶tu...
炎热的夏季已经慢慢远去,凉爽的秋季悄悄来到我们的身边,很多MM的食欲会增加,可是食欲是减肥的大敌,那么,怎样控制食欲呢?下面就介绍4款抑制食欲的食物,教你有效控制食欲,预防秋季肥胖。 抑制食欲的食物 抑制食欲的食物1.地瓜 地瓜是备受注目的碱性健康减肥食品。卡路里含量是大米和小麦的3分之1,维他命E的含量却是玄米的2倍,维...
想要减肥首先是在食量上一定要控制好,如果控制不了,食量还是那么大,肯定减不了肥,很多人就会选择减肥药,我们应该都知道吃了减肥药食欲好像就不是那么强了,这就是减肥药会有抑制食欲的功能,会让您的食欲下降很多,这样才能够达到减肥的目的,大家对抑制食欲的减肥药应该了解清楚。 抑制食欲减肥药 抑制食欲的减肥药在...
标签: 饥荒
《饥荒》控制台代码使用及寻找代码方法 《饥荒》中玩家们可以利用控制台代码进行一些适量的作弊,很多新手玩家对于控制台使用方法不熟悉,接下来为大家带来代码大全,还不会使用控制台代码的玩家们可以参考使用。 控制台是《饥荒》中开发者界面,用于测试,或者某种原因(有时也用来暂停游戏)。 在游戏中可以用键盘左上角~键打开。 控制台有...
标签: 养生 健康
优质红茶和劣质红茶的辨别 红茶既然有真假之分,那么在真品红茶中,也必然有品质的优劣之分,将其拟人化,就是“佳人”与“嫫母”的天壤之别,红茶是健康的饮料,品质优劣不仅与口感风味有着密切的关系而且也会影响到人体的健康。按照品质优劣的程度,将红茶分为优质茶、次品茶和劣质茶三种。凡品质特征符合食品质量和卫生标准要求...