宏定义只有一个参数

经常在一些代码中看到,#define 后面接一个参数,比如:#define IN或者#define MUX什么的,一般宏定义后面都会再跟一个参数表示要代替的值,另外就是跟ifndef结合使用的防止多次包含头文件的,只有一个参数。而这里又是什么意思呢?

那个是空宏定义,用于标记,便于理解(因为实际编译时改宏变为“空“)
最典型的是
#define DEBUG
#define UNICODE
如果像这样,define后面只有一个名字,那么这个宏是空的,不会对代码产生影响。
这里我说一下UNICODE宏。
UNICODE宏被定义的时候,代表程序使用unicode,否则是多字符集的。字符集不同会影响很多函数,因为Win32API中同一个函数分为A和W 2套,这里的处理类似这种:

#ifdefine UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif

这里,如果你的程序使用了UNICODE,VS编译器会为你定义UNICODE宏,你使用MessageBox函数,实际使用的是MessageBoxW。反之,如果没有勾选使用unicode的选项,则UNICODE宏未定义,使用MessageBox函数的时候,实际使用到的是MessageBoxA。
这样的好处显而易见,通过一个UNICODE宏做标记,程序可以对应Unicode和ASCI2个不同的版本,想要切换就变得很方便。

另一个常见的空宏定义,是IN 和OUT。
它们用来对函数进行说明,你去看MSDN,微软的所有函数,都是这个样子的,比如说下面这个:
FARPROC WINAPI GetProcAddress(
  _In_  HMODULE hModule,
  _In_  LPCSTR lpProcName
);
前面的_In_就是用来说明,这个是输入参数。类似还有_Out_表示输出参数,_Opt_表示可选参数,而且可以连用,因为它们本来就是空定义。

总之,宏定义是可以为空的。空定义一般都是来做说明(IN OUT宏),或者作为一个标记(UNICODE和DEBUG宏),起到切换配置的作用。

就是说在代码中间插一个IN表示后面的是输入参数,而这个IN又不会对编译产生影响,所以起到的作用就是便于阅读,这样理解对吗?


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值