经常在一些代码中看到,#define 后面接一个参数,比如:#define IN或者#define MUX什么的,一般宏定义后面都会再跟一个参数表示要代替的值,另外就是跟ifndef结合使用的防止多次包含头文件的,只有一个参数。
而这里又是什么意思呢?我用gcc -E看了一下,这样不会对编译后的代码产生任何影响,网上其他人说是为了标记,但又没说清楚怎么个标记法,麻烦各位芝麻帮忙答疑解惑。
define只有一个参数
答案:2 悬赏:20
解决时间 2021-03-09 13:35
- 提问者网友:沉默的哀伤
- 2021-03-08 13:56
最佳答案
- 二级知识专家网友:浪者不回头
- 2021-03-08 14:49
那个是空宏定义
最典型的是
#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宏),起到切换配置的作用。
最典型的是
#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宏),起到切换配置的作用。
全部回答
- 1楼网友:你把微笑给了谁
- 2021-03-08 16:12
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯