Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我是否应该避免使用typedef,尽可能使用基本名称和强制转换?_C++_Winapi_Types_Casting_Typedef - Fatal编程技术网

C++ 我是否应该避免使用typedef,尽可能使用基本名称和强制转换?

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){

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

当我在WiLAPI中工作,对C++的知识不太可靠时,我发现很多TyPufF的东西,对于我来说,似乎使问题变得过于复杂,并且还需要添加一件我必须记住的事情。 例如,
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