中易网

define只有一个参数

答案:2  悬赏:20  
解决时间 2021-03-09 13:35
经常在一些代码中看到,#define 后面接一个参数,比如:#define IN或者#define MUX什么的,一般宏定义后面都会再跟一个参数表示要代替的值,另外就是跟ifndef结合使用的防止多次包含头文件的,只有一个参数。
而这里又是什么意思呢?我用gcc -E看了一下,这样不会对编译后的代码产生任何影响,网上其他人说是为了标记,但又没说清楚怎么个标记法,麻烦各位芝麻帮忙答疑解惑。
最佳答案
那个是空宏定义
最典型的是
#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是宏定义的意思 2. 宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。 3.宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。 4.宏定义其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。
  • 我要举报
    如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
    大家都在看
    我心心念念的人,英文怎么翻译?
    低于2500跑分20w的电脑显卡 淘宝京东等等上的
    《名侦探柯南》中,“真相只有一个”用日语怎
    为什么我的iPhone 7没有收到10.3更新推
    hibernate 三张表主键关联,假设一个人有姓名
    酬乐天扬州初逢席上见赠这首诗中,借用典故,暗
    15乘几等于二分之二十五
    win7环境,oracle 11g 导出的数据库格式为 数
    阳光味道泸县分店我想知道这个在什么地方
    永城市酂阳派出所这个地址在什么地方,我要处
    怪物猎人X 茸食珠怎么获得???
    大火什么的着填象声词
    在埃及当工程师有多少人民币一个月
    看小说安全最小内存的app
    个人缴纳养老保险金额是多少
    推荐资讯
    广东能否种植柿子
    手机号码筛选用什么系统效果最好
    少林五祖 马超兴的真实名字
    清朝嘉庆能与英国对抗
    求给自己唱一首赞歌的作文800
    金碧物业和建业物业哪家牛
    亨通集团总部研发中心录用,同时也考上西安交
    你好,请问X58剑齿虎的超频,你找到方法没?
    过冬数九,今天是几九第几天了
    风行电视支持airplay嘛
    无线网卡热插拔后无法识别了
    谁知道一款Root软件图标是绿色的,上面有白色
    手机登qq时,显示手机磁盘不足,清理后重新登
    刺客的套装怎么选啊?