键入一个类型和相同类型的指针的正确方法是什么?

键入一个类型和相同类型的指针的正确方法是什么? 这就是我的意思。 我应该这样做:

typedef unsigned int delay; typedef unsigned int * delayp; 

或者我应该这样做:

 typedef unsigned int delay; typedef delay * delayp; 

或者也许我根本不应该delayp指针而只是使用delay *而不是在我认为必要的任何地方delayp

谢谢,Boda Cydo。

正确的方法是不要这样做。 隐藏某事物是指针这一事实通常被视为糟糕的风格。

typedef unsigned int delay,* delayp;

typedef ing原始指针类型是没有意义的(哈!)。 它不提供任何真正的抽象(消费者仍然必须理解类型是指针,并且他们必须弄清楚如何解析用于typename的任何命名约定以确定指针类型是什么)。

这也是糟糕的forms,因为如果你有:

 typedef T* T_ptr; 

然后const T* fooconst T_ptr bar是两个非常不同的东西。 ( foo是一个指向const T的指针;它是一个不通过该指针改变指针的承诺.bar是一个本身是const的指针;它不能被改为指向别的东西。)

第一种情况(指向const指针)很重要:它有助于强制执行函数契约。

第二种情况非常有用。

因此,如果要为指针类型添加typedef ,为了有用,您需要创建两个:

 typedef T* T_ptr; typedef const T* const_T_ptr; 

当你有智能指针类时,C ++中有一个可容忍的exception。 在这些情况下,输入boost::shared_ptr可能会非常繁琐,因为为它创建一个typedef是一个合理的便利。

通常,您执行第二个块,因为您正在重新使用该类型。 例如,如果delay需要成为unsigned long ,则不需要修改delayp的定义。

也就是说,隐藏在typedef背后的指针通常是一个非常糟糕的主意。 对于像指针一样的东西,比如迭代器或智能指针,它更容易被接受:

 typedef std::vector my_container; typedef my_container::iterator my_iterator; typedef some_type my_type; typedef shared_ptr my_shared_ptr; 

int情况下它不应该有任何区别,但是在聚合类型的情况下,后一种方法更好,因为在前一种情况下*delay不等于delayp ,并且需要使用cast来交替使用它们。

但正如其他人所说,你最好只是delay

你的第二个表格

  typedef delay * delayp; 

更好的是因为如果您将来希望将“delay”typedef从int更改为其他内容(例如,long),则只能在一个地方进行此更改。

如果你想让自己(将来)迁移到某种智能指针而不是原始指针(如果使用指针typedef,你的代码将保持几乎相同),隐藏指针可能很有用。否则,隐藏指针是不可用的。