经常在一些代码中看到,#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又不会对编译产生影响,所以起到的作用就是便于阅读,这样理解对吗?
宏定义只有一个参数
最新推荐文章于 2023-11-13 18:47:01 发布