为什么我应该在C++中使用typedef?

Tom*_*Tom 4 c++ typedef

让我们说:

set<int, less<int> > m_intset;
Run Code Online (Sandbox Code Playgroud)

这是有效的,但现在我将其更改为typedef,我最终得到两行代码:

typedef set<int, less<int> > SetInt;
SetInt m_intset;
Run Code Online (Sandbox Code Playgroud)

这样的优势是typedef什么?我正确使用它吗?

gol*_*udo 18

使用typedef的一些优点:

  1. 简化:现在,每当你通常需要时set<int, less<int> >,你只需要输入SetInt.如果你只使用一次这个集合没什么大不了的,但是如果你有同一个集合的多个实例,或者需要访问它的迭代器,那么更短的形式更容易阅读和输入.

  2. 澄清:set<int, less<int> >并没有告诉我任何关于变量用途的信息,只是它是一组整数.使用typedef,您可以选择一个标识符来解释类型的用途,例如InventoryCoordinates.

  3. 抽象:程序改变.虽然您可能认为自己set<int, less<int> >现在需要,但您的要求可能会在未来发生变化,从而需要进行一项set<unsigned long, less<unsigned long> >vector<int>其他更改.通过使用typedef,您只需要在一个地方修复它,它将影响SetInt程序中的每个实例.与手动更改源文件中的十几个或更多条目相比,这更容易并且更不容易出错.

由于上面的第2点和第3点,当在类或库中使用时,typedef可以非常强大,因为它可以加强接口和实现之间的分离,这通常被认为是良好的C++形式.

当然,如果你在同一个程序中多次使用相同的类型,这些优点中的大多数只会真正显示出来.如果你只想使用set<int, less<int> >一次,typedef可能是矫枉过正.


Dre*_*all 5

Typedef主要是符号方便,但它们确实有很多好处:

  • 声明函数指针类型(例如,用于回调) - 在完全拼写时很难完成.
  • 依赖类型信息更容易描述(例如SetInt :: iterator)并且你应该改变主意(假设你去了一个hash_set而不是std :: set),由于typedef而立即有效地更新
  • 他们比内置类型名更好地描述了intent(例如typedef int ErrCode)

我敢肯定还有更多我没想到......

  • 我知道在没有`typedef`的情况下无法做到这一点的一个案例是当你需要一个带有C++调用约定的函数来获取一个参数或者将一个函数指针类型的值返回给一个具有C调用约定的函数.你不能在单个参数上使用`extern"C"`,并将它作为一个整体应用于它的所有参数以及函数本身.我知道的唯一解决方法是在`extern"C"{...}`中为函数指针类型创建一个`typedef`,然后使用它. (3认同)