【问题标题】:What is the right way to typedef a type and the same type's pointer?typedef 类型和相同类型的指针的正确方法是什么?
【发布时间】:2011-03-28 19:34:45
【问题描述】:

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

typedef unsigned int delay;
typedef unsigned int * delayp;

或者我应该这样做:

typedef unsigned int delay;
typedef delay * delayp;

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

谢谢,博达·赛多。

【问题讨论】:

    标签: c++ c pointers typedef


    【解决方案1】:

    正确的方法是不去做。隐藏某物是指针的事实通常被视为不好的风格。

    【讨论】:

    • 没错。并且以一种不清楚它的指针是邪恶的方式命名指针类型。
    • '隐藏某些东西是指针的事实通常被视为不好的风格。'谁说的?
    • 我同意隐藏指针可能会导致混乱。但是我可以使用不隐藏指针性质的typedef delay* delay_ptr;。 @Sam,这取决于情况。一般来说,除非你想要它,否则它可能会导致混淆(也就是说,你在处理程序中提供了一个不透明的类型......)
    • 哦,天哪,如果我每次看到它都能得到 5 美分。顺便说一句,我完全同意。
    • @Sam:对指针进行类型定义会导致不一致。即 const delay*const delayp ( == delay* const) 不是同一类型。您不能将 constvolatile 限定符添加到 typedef 的指针/引用。所以要么你需要生成所有可能的变体......或者根本不将类型定义为指针/引用类型。
    【解决方案2】:

    typedef unsigned int 延迟,*delayp;

    【讨论】:

    • 这非常令人惊讶,因为我认为 typedef 是这样工作的:typedef (...) new_name。所以在指针的情况下,我认为它是typedef (unsigned int *) new_name。现在事实证明它就像声明类型一样工作,所以它不是typedef (...) new_name,因为在typedef unsigned int delay, *delayp 中,(...) 部分仍然是(unsigned int),但* 已经移动到delayp 附近。我现在其实很困惑。
    • @bodacydo: typedef 语法的工作方式与声明变量相同。
    【解决方案3】:

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

    也就是说,将指针隐藏在typedef 后面通常是一个非常糟糕的主意。对于像指针、迭代器或智能指针等作用的东西来说,它更容易接受:

    typedef std::vector<int> my_container;
    typedef my_container::iterator my_iterator;
    
    typedef some_type<blah> my_type;
    typedef shared_ptr<my_type> my_shared_ptr;
    

    【讨论】:

      【解决方案4】:

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

      这也是一种不好的形式,因为如果你有:

      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++ 中是一个可以容忍的例外。在这些情况下,输入boost::shared_ptr&lt;T&gt; 可能会很乏味,因此创建typedef 是相当方便的。

      【讨论】:

        【解决方案5】:

        int 的情况下,它不应该有任何区别,但在聚合类型的情况下,后一种方法更好,因为在前一种情况下*delay 不等于delayp,并且需要强制转换可以互换使用。

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

        【讨论】:

          【解决方案6】:

          你的第二种形式

          typedef delay * delayp;
          更好,因为如果您将来希望将“延迟” typedef 从 int 更改为其他内容(例如 long),您只能在一个地方进行此更改.

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-10-08
            • 1970-01-01
            • 2023-04-02
            • 2013-03-12
            • 1970-01-01
            • 2013-09-09
            • 1970-01-01
            • 2019-01-12
            相关资源
            最近更新 更多