关于宏定义

1。宏定义的参数不能带类型

如#define TtoA(LPCSTR lpszA, LPTCSTR lpszT) wsprintfA(lpszA, "%ls", lpszT);

是不对的。

应该为#define TtoA(lpszA, lpszT) wsprintfA(lpszA, "%ls", lpszT);

2。宏定义里面不能带有条件指令

如#define...

     #ifdef

    #endif

3. 宏定义中的##和#

## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token连接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。

#符是把传递过来的参数当成字符串进行替代,简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号

补:##符或#符只有在双引号之外时才起作用,因为如果在双引号之内的话,它本身就是字符串本身的一部分了。

假设程序中已经定义了这样一个带参数的宏:

#define PRINT( n ) printf( "token" #n " = %d", token##n )

同时又定义了二个整形变量:

int token9 = 9;

现在在主程序中以下面的方式调用这个宏:

PRINT( 9 );

那么在编译时,上面的这句话被扩展为:

printf( "token" "9" " = %d", token9 );

逗号前面的拼接成了一个字符串,也即

printf("token9=%d", token9);

token##n 中,9原封不动的与token连接在了一起,成为了token9。而#n被”9”所替代。

结果打印出token9=9

补充:还是用例子好理解

假设调用PERROR("socket")。

(1)#define PERROR(a) printf(""a": %d", (int)GetLastError())

          打印结果:socket: 10093

(2)#define PERROR(a) printf(""#a": %d", (int)GetLastError())

      打印结果:"socket": 10093

(3)#define PERROR(a) printf("a: %d", (int)GetLastError())

      打印结果:a: 10093

(4)#define PERROR(a) printf("#a: %d", (int)GetLastError())

         打印结果:#a: 10093

(5)#define PERROR(a) printf(""##a": %d", (int)GetLastError())

        编译错误

(6)#define PERROR(a) printf("##a: %d", 1##a)

       假设调用PERROR("socket"),则编译错误,因为1##a展开后成了1"socket"。

       假设调用PERROR("23"),也同样编译错误,因为1##a展开后成了1"23"。

       假设调用PERROR(23),则正确,打印结果:##a: 123

这个讲的更清晰:https://www.cnblogs.com/shelley-AL/p/10714705.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值