当前位置: 代码迷 >> C++ >> typedef的奇怪用法解决思路
  详细解决方案

typedef的奇怪用法解决思路

热度:3502   发布时间:2013-02-26 00:00:00.0
typedef的奇怪用法
#ifdef STRICT
typedef void *HANDLE;
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
#else
typedef PVOID HANDLE;
#define DECLARE_HANDLE(name) typedef HANDLE name
#endif
typedef HANDLE *PHANDLE;


以上是摘录windws.h里的东东。

没看懂其意思, 我觉得还是我的c基础太差导致的。

解读这2句:
typedef void *HANDLE;
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ 

意思是首先 HANDLE是一个void* 类型

然后又成为了一个 结构体指针。


是不是疯了? 把两种类型定义为HANDLE.

难道可以这样使用嘛?

typedef int* pMyInt;
typedef  short* PMyInt;

这2句难道对嘛??


------解决方案--------------------------------------------------------
这句是一个宏, 宏的名字是DECLARE_HANDLE, 和HANDLE没有半毛钱关系, 这个宏接受一个参数 name, 构造一个动态的结构
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
// 假设你代码为
DECLARE_HANDLE(CSDN); 
// 自动扩展为
struct nameCSDN__ { int unused; }; 
typedef struct nameCSDN__ *name;


就是这样.
------解决方案--------------------------------------------------------
VS2012上面STRICT是定义的. 

#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;


------解决方案--------------------------------------------------------
引用:
引用:引用:引用:C/C++ code?12345678910111213141516171819202122int _tmain(int argc, char* argv[]){/*如下预编译已经在winnt.h里面了,在复制到这里没什么意义. */#……


纠正一下,typdef 语句是申明语句,不存在重复定义的说法。