学过C和C++以后,真正开始编程时,遇到的最大的困惑就是自动生成的程序模板里,有大量的系统自定义的数据类型,比如:HWND HINSTANCE等等。我的问题是:这些数据类型其实就是int是吗?所以,HWND hwnd实际上就等于int hwnd是吗?所以,按照我的理解:系统虽然使用了HWND这个数据类型,但这也只是便于阅读而已,实际上VC++系统并没有为HWND这个数据类型作过任何定义。我这样的理解对吗?

解决方案 »

  1.   

    比如说这样一条语句:HMENU hMenu。HMENU是数据类型指的是菜单句柄,存储方式是Dword,那么系统在内部是不是有了定义,比如只能取小于h80000000的才行,而大于h80000000的都不正确,那么在程序中,如果出现大于h80000000的菜单句柄就会报错。有这种情况吗?我的意思可能没说清,我是说系统定义的这些数据类型,花样繁多,只是便于阅读而已,实际上系统内部什么工作也没有做,只是做了HWND int这样的宏定义而已。是不是这样?
      

  2.   

      是为了可移植。你要知道,Windows 3.X以前,还是16位32位混的,现在Windows都有64位版本的了,显然像指针类型等,其实际长度可能是不一样的。
      本来C/C++有typedef,推荐使用这个来建立标准的类型别名(但它不像Ada,也并没有建立真正的类型,除了class、struct、union等能建立以外,就是* & []),但是使用宏有另一些好处,它会把不同版本的处理放到预处理期,就是个巧妙的文字游戏,又不增加额外的运行时开销(Cer是很强调这一点的)。虽然很多人说宏不好,但是在C、C++的实践中,往往追求把宏发挥到极致。
      Windows中典型不过的例子就是依赖_UNICODE的TCHAR、_T……,而C中典型的例子像stdarg.h,每种机器具体环境在自动变量的操作上有所区别,而通过使用预处理和宏,做到了可移植,统一代码。
      

  3.   

    我明白了,原来是为了可移植。但在同一种机器上,同一个操作系统版本下,HWND就是dword类型,并没有做其他工作,比如限定其取值范围什么的。
      

  4.   


    C++不是Ada,没有值的范围约束,而且它的“强类型”和Ada是没法比的。没有
    type SomeIntType is Integer Range 0..200; --这样的语法
    在C++中,运算溢出往往并不报错。