C++ 我是否应该避免使用typedef,尽可能使用基本名称和强制转换?
我不确定这里的词汇,但希望我能让自己明白 当我在WiLAPI中工作,对C++的知识不太可靠时,我发现很多TyPufF的东西,对于我来说,似乎使问题变得过于复杂,并且还需要添加一件我必须记住的事情。 例如,C++ 我是否应该避免使用typedef,尽可能使用基本名称和强制转换?,c++,winapi,types,casting,typedef,C++,Winapi,Types,Casting,Typedef,我不确定这里的词汇,但希望我能让自己明白 当我在WiLAPI中工作,对C++的知识不太可靠时,我发现很多TyPufF的东西,对于我来说,似乎使问题变得过于复杂,并且还需要添加一件我必须记住的事情。 例如,UINT而不是unsigned int,HBITMAP,它原来只是一个句柄,还有很多其他的 我的问题是,我是否可以/应该在可能的情况下替换该类型的更通用版本,并在需要时将其丢弃(以及,这叫什么) 例如,我想写作 void-SomeFunction(unsigned-int-some-int){
UINT
而不是unsigned int
,HBITMAP
,它原来只是一个句柄
,还有很多其他的
我的问题是,我是否可以/应该在可能的情况下替换该类型的更通用版本,并在需要时将其丢弃(以及,这叫什么)
例如,我想写作
而不是void-SomeFunction(unsigned-int-some-int){…}
void-SomeFunction(UINT-some-int){…}
HANDLE hBMP=LoadImage(…);图像列表添加(…(HBITMAP)hBMP代码>而不是
HBITMAP hBMP=…
这对新手来说是好的,一般来说是坏的,还是什么?请不要
typedef
明显的(即UINT
对于无符号int
)。相反,typedef
来传达意义UINT
并不比unsigned int
好多少(有些人可能会认为它更短,但说真的,它没有那么短)
在我看来,长名称的typedef
(就像std::map::const_迭代器的typedef
)是可以的,因为它提高了可读性<代码>UINT
。。。没有那么多
一个typedef
来传达特定类型/用途的特定含义(如HANDLE
)是不错的选择<在我看来,code>HANDLE比使用原始void*
要好,因为a)我不在乎HANDLE
是否是void*
,b)它传达了它的目的
用于可移植性的typedef
很好(就像用于32位有符号整数的typedef),因为它允许在平台/编译器之间进行更轻松的转换
这对新来者是好的,一般来说是坏的做法,还是什么?
这是一种坏习惯。您不应该使用实际的类型
typedef通常用于不同平台和编译器实现上的可移植性。因此,您应该避免使用实际类型而不是类型定义的名称。使用实际类型将使代码与所使用的平台和编译器实现更紧密地耦合,事实上,如果这种组合发生变化,它可能无法正常工作
此外,类型化的名称比程序员更直观,并且对程序员的了解更为广泛,这也是为什么要坚持那些名称的原因。
< P > 1)Win32 API实际上是C,而不是C++。 如果你考虑MFC或ATL之类的东西,两者都是“面向对象”的,即只有C++的API,那么区别就变得更重要了。幸运的是,这两者都已经过时了 2) 微软喜欢使用大量的宏和typedef。我不能说这是“好”还是“坏”。这只是生活中的一个事实。如果你长时间使用Windows,它将成为你的第二天性 3) 最重要的是-是:在使用Microsoft API时,您一定要遵守Microsoft惯例。当MSDN页面显示“句柄”时使用“句柄”是一件好事。类似的建议适用于“LPxxx”、“TRUE”、“FALSE”、“INVALID_HANDLE”、“HRESULT”等。如果这是MSDN中所说的,那么这就是您应该使用的 它不仅会使您的代码更具可读性。。。但是,令人惊讶的是,它还可以防止“事后猜测”真实类型可能导致的细微错误 不要试图“二次猜测”类型。这只是个坏主意 遵循标准惯例将使生活更容易、更安全、更可靠和更便携IMHO…
typedef
不仅对便携性有用,而且对将来的校对也有用。如果MicroSoft在某个时候决定UINT
应该是typedef
而不是unsigned int
,那么使用UINT
将确保代码继续工作。这种类型的更改是不太可能的,特别是对于像微软这样的大公司的代码,但这种想法仍然成立:typedef
适合于许多类型的抽象。它们一点也不坏,但你偶尔也能找到使用不当的例子。如果您正在使用其他人的API,请始终使用他们的typedefs
。他们可能有很好的理由进行抽象。使用typedef有几个原因
typedef unsigned int UINT
typedef int INT64
typedef句柄HBITMAP
HBITMAP-HBITMAP=…
而不是HANDLE-HBITMAP=…
,因为我(通常)不会写animaldog=newdog()
因为更具体一些可以帮助读者了解你的代码,而且你不会损失任何东西,因为根据你可以在任何地方使用动物
实例,你都可以使用狗
实例
你也可以考虑使用,如果你使用C++,用Boost,这基本上创建了一个简单的类,因此,给你一个真正的新类型(这意味着你不能像你可以使用的那样混合使用代码>句柄< /代码>和<代码> HbMePux
您所描述的强制转换并不是真正的强制转换,因为类型相同,
typedef
只创建别名,而不是新类型
HANDLE hOtherBitmap=/*一些代码*/
HBITMAP HBITMAP=(HBITMAP)hOtherBitmap;
就像写作一样
int i=/*某些值*/
int k=(int)i;
句柄
不是nati