当前位置:C++技术网 > 精选软件 > 宏定义的空格怎么理解以及##有什么用

宏定义的空格怎么理解以及##有什么用

更新时间: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的Unicode版本的宏定义如下:
#define __T(x) L##x
    x是宏参数,x和后面的x保持一致。其他字符都原封不动的作为一个映射关系,这里就是将__T()和L作为一个映射。所以最终_T("")就会被映射为L"",x就是""。那么现在的问题就是##了。
    ##是粘贴符号。所谓的粘贴符号,就是像胶水一样,将##前后的东西粘在一起。所以你可以看到最后L和""粘在一起了。##本身是一个说明符号,并不会出现在最后的替换符号中的。
    所以我们来看看比较晦涩难懂的宏定义,定义如下:
#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
    这样是不是就是大家最常见的结构体定义类型。而造成大家不懂的,就是这么两个障碍点--空格和##。而换成好看的格式,这不算是难点吧,你动手就行了。