更新时间:2015-12-04 13:30:53浏览次数:1+次
如果你经常查看Win32的类型定义,可能会发现宏定义中发现##这个东西。我一般的第一反应是,赶紧关掉,这太奇葩的定义了,看不懂。
然而今天我稍微了解了一下,明白了怎么回事。再回去看之前那些看了就害怕的定义,发现懂了。
#define 宏(宏参数) 被替换的字符串,含宏参数
首先必须知道,宏定义后面的字符串可以有空格的。比如:#define MSG this is a Meaasge
那么,你在使用MSG宏时,就相当于在使用后面的这一串字符,直接替换。比如:char str[]=MSG;// - 错误的
因为这句代码展开就是:char str[]=this is a Meaasge;// - 这是什么鬼
所以要正确当做一个字符串,要在后面加上双引号哦。上面这样直接替换后,this是关键字,也是一个问题。#define __T(x) L##x
x是宏参数,x和后面的x保持一致。其他字符都原封不动的作为一个映射关系,这里就是将__T()和L作为一个映射。所以最终_T("")就会被映射为L"",x就是""。那么现在的问题就是##了。#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name
这里name就是宏参数,后面的【struct name##__{int unused;}; typedef struct name##__ *name】都是被定义的字符。在用参数name替换之后,然后将##去掉,将前后放在一起就可以了。如:struct myType__{int unused;}; typedef struct myType__ *myType
这样再换成多行的格式来看,如下:struct myType__
{
int unused;
};
typedef struct myType__ *myType
这样是不是就是大家最常见的结构体定义类型。而造成大家不懂的,就是这么两个障碍点--空格和##。而换成好看的格式,这不算是难点吧,你动手就行了。相关资讯