我应该避免使用typedef,尝试使用原始名称并在可能的情况下进行转换吗?

Ben*_*Ben 3 c++ winapi types casting typedef

我不确定这里的词汇,但希望我能让自己明白.

当我正在使用一个不那么坚如磐石的C++知识来完成winapi时,我发现很多typedef的东西,对我来说,似乎使问题过于复杂,并添加了一件我必须记住的事情.

例如,UINT而不是unsigned int,HBITMAP结果只是一个HANDLE,而很多其他.

我的问题是,是否可以/应该在可能的情况下替换该类型的更通用版本,并在需要时将其删除(以及这称为什么)?

例如,我想写

  • void SomeFunction(unsigned int some_int) { ... } 代替 void SomeFunction(UINT some_int) { ... }

  • HANDLE hBMP = LoadImage(...); ImageList_Add(... (HBITMAP) hBMP ...); 代替 HBITMAP hBMP = ...

这对新手来说是好事,一般来说是不好的做法,还是什么?

pau*_*sm4 7

1)Win32 API实际上是C,而不是C++.

如果你考虑像MFC或ATL这样的东西,这两者都是"面向对象的",只有C++的API,这一区别变得更加重要.而这两个都是仁慈地变得(已成为?)过时了.

2)Microsoft喜欢使用大量的宏和typedef.我不能说这是"好"还是"坏".这只是生活中的一个事实.如果您在Windows上工作任何时间长度,它将成为您的第二天性.

3)最重要的是 - 是的:当您使用Microsoft API时,您应该遵循Microsoft惯例.当MSDN页面显示"HANDLE"时使用"HANDLE"是一件好事.类似的建议适用于"LPxxx","TRUE","FALSE","INVALID_HANDLE","HRESULT"等等.如果这就是它在MSDN中所说的那么,那就是你应该使用的.

它不仅会使您的代码更具可读性......但是,令人惊讶的是,它还可以防止 "第二次猜测""真实类型"可能导致的细微错误.

千万不能尝试"第二次猜测"的类型.这只是一个坏主意.

遵循标准惯例将使生活更轻松,更安全,更可靠,更便携.

恕我直言...


Cor*_*lks 6

请不要typedef明显的(即UINTunsigned int).相反,typedef传达意义.UINT没有优于unsigned int(有些人可能会认为它是短,但严重的是,这并不是要短得多).

一个typedef相当长的名字(如typedefstd::map<unsigned int, flost>::const_iterator),在我看来,没关系,因为它提高了可读性.UINT... 没那么多.

A typedef传达特定类型/用途(如HANDLE)的具体含义是体面的.HANDLE在我看来,比使用原料更好,void*因为a)我不在乎是否HANDLEa void*,b)它传达了它的目的.

typedef用于便携性好的(例如对于32位带符号整数一个typedef),因为它允许平台/编译器之间更容易转变.

  • 'unsigned int`的Typedeffing`UINT`不用于缩短它,而是用于移植性.如果你在平台A上键入它为`unsigned int`,但是然后在平台B上输入另一个类型,你将不必像往常那样重写代码. (4认同)
  • @SingerOfTheFall:如果`UINT`对于`unsigned int`不是`typedef`,那么它会产生误导,如果是,那就没用了,在任何编译器/平台上看到`unsigned int`总是意味着"无符号整数" .用于32位无符号整数的`typedef`是有意义的(因为它更多地关于32位而不是无符号整数),但是对于未指定大小的无符号整数的`typedef`几乎不可移植. (2认同)