2 zpcdcsdn zpcdcsdn 于 2015.07.17 21:21 提问

关于winnt.h头文件中有关句柄(HANDLE)的一段源代码的两个疑问,求大神解答。

大家好!我对winnt.h中的这段代码有疑问:

#ifdef STRICT
typedef void *HANDLE;
#if 0 && (_MSC_VER > 1000)
#define DECLARE_HANDLE(name) struct name##__; typedef struct name##__ *name
#else
#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name
#endif
#else
typedef PVOID HANDLE;
#define DECLARE_HANDLE(name) typedef HANDLE name
#endif
typedef HANDLE *PHANDLE;

以上代码摘自用Visual Studio 2013打开的winnt.h头文件。

我有两个问题:

第一个问题:
#if 0 && (_MSC_VER > 1000),因为有if 0,那么,这不是意味着下边那句
#define DECLARE_HANDLE(name) struct name##__; typedef struct name##__ *name
将永远不会被执行到吗?
既然如此,那为什么还要这样写?
是有什么特殊用意吗?如果是,那特殊的用意是什么?

第二个问题:

上面代码的第6行中,int unused是做什么用的?为什么命名为unused,是真的没有用吗?如果真的没用,那为什么不直接去掉这句而只保留一个空的结构体?如果有用,那作用是什么?

真诚期待大家给予解答,在这里先谢谢大家了!

4个回答

zuishikonghuan
zuishikonghuan   2015.07.17 22:01

问题1。关于if 0
包括我这种强迫症,对于低版本的代码,在新版中不需要或有更好的方法以后,不舍得删掉辛苦写的旧代码,就喜欢用if (0)围起来作废,而编译优化会在编译时自动忽略掉这些代码的。
问题2。微软这么做肯定有他的用意,也许现在没用但,或许将来有用呢

zpcdcsdn
zpcdcsdn 非常感谢!通过您的解释,我又长了一些经验,再次感谢!
2 年多之前 回复
91program
91program   Ds   Rxr 2015.07.17 23:11

别人代码的含义,特别是宏定义之类,你千万猜。猜了也没什么用!
特别是所谓的历史含义、可能是多人维护后的代码。

zpcdcsdn
zpcdcsdn 嗯嗯,谢谢。
2 年多之前 回复
zpcdcsdn
zpcdcsdn   2015.07.18 18:16

关于int unused,在下后来又有一点自己的想法,由于篇幅原因,请看在下博客:
http://www.cnblogs.com/zpcdbky/p/4652151.html
http://www.cnblogs.com/zpcdbky/p/4656449.html

oyljerry
oyljerry   Ds   Rxr 2015.07.18 19:51

if 0应该是不希望被用到后面的定义,但是开发的时候,可能作者有需要用到或自己做调试等用到。所以保留了这个开关。

int unusd一般是保留代码,windows中有很多这种做法,一般是目前还没有具体作用,但是作为占位符等先保留。

这都是一些历史遗留代码等维护下来的。知道大概意思就可以了,不用特别深究。

zpcdcsdn
zpcdcsdn 哦哦,真心感谢!
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片