Typedefing指针类型

jay*_*lee 4 c c++ pointers typedef

我一直在阅读SO,并遇到了以下问题,这些问题涉及为什么typedefing指针类型不好.

不透明的C结构:它们应该如何声明?Const-correctness和不可变的分配对象

我想知道是否有人可以扩展并解释为什么typedefing指针类型很糟糕,并且可能提供一些可能发生错误的示例.

另外,如果typedefing指针类型确实是禁忌,那么为什么Win32 API会这样做呢?在Win32 HANDLE(和有效的句柄类型)中,typedef为a void *.

Che*_*Alf 11

约翰内斯已经说过typedef"指针本身并不坏,我同意.

一些指导原则,基于我对清晰度和可维护性的主观意见:

  • 通常 typedef函数指针类型.

    原因:
    函数指针声明可能变得非常混乱和不可读.

  • 通常不是 typedef指针类型不是抽象的原始对象指针(例如,当您只需要"指向T的指针"时).

    原因1:
    比较清楚地看到Foo*或者Foo const*说比较清楚FooPtr.使用名称,您必须查找名称以查看其定义的名称.也许它是一些智能指针,也许它是一个指针const,无论如何; 这个名字让你不必要地去别处看.

    原因2:
    有些程序员通过的组合混淆consttypedef"编指针类型.例如,在Microsoft代码中,我已经看过相当FooPtr const多次,程序员显然认为这意味着它Foo const*.但事实并非如此Foo* const.

  • 当指针类型是抽象时,通常也做 typedef一个原始对象指针,一种指针类型,可以想象将来可以用其他类型替换,例如HANDLE.

    原因:与使用命名常量相同:没有正确的名称,搜索和替换可以更改意味着其他内容的事件,并且无法更改未以完全"正确"方式表达的事件.

然而,与几乎所有类型的风格一样,赞成和反对的论据相当薄弱,因此最终的选择归结为个人偏好,编码标准,同事意见等等.

鉴于自由选择,以上通常是我选择的.但在特殊情况下,我偏离了这些准则/规则.和好艺术一样,好的代码是由那些了解规则的人产生的,也知道何时打破他们......

干杯&hth.,


Joh*_*itb 6

typedef指针类型并不客观.编写得很好的代码使用它来键入指向处理函数类型的指针,它也常见于像HANDLER.

一个人的个人观点可能是坏的,但绝对不是广为人知的观点.我一个人根本不同意这个意见.我自己更少使用这个选项,但我仍然认为它不是"坏".