#define 宏的用法

1. 格式:

   #define identifier string

   在源程序中,遇到标识符identifier,用string来代替。

 

2. 注意事项:

   a) identifier标识符不能有空格,identifier空格之后遇到的第一个字符开始就是string的内容,并且string的内容只能是一行

   b) string的内容多行如何写:如果string的内容要写成多行,就要使用续行符/,续行符号/后面不能在有新的字符、空格等,只能是回车换行。

      例: 续行符/ 后面不能有其他的字符

       #define TEST_MACRO(a,b)  a  /

              + b

3. 转载一些常用的用途

 

条件编译、预编译等

debug版本中的调试信息宏定义

 

方法一:

#ifdef DEBUG
#define DbgPrintf printf
#else
#define DbgPrintf //
/DbgPrintf
#endif

如果DEBUG已经定义了,那么不用说,当然是用printf去代替DbgPrintf了。
下面只分析DEBUG未定义的情形,这个宏定义实际上是将“DbgPrintf”定义成了“//DbgPrintf”,由于续行符的作用,#define定义时不会发现注释符“//”,但是在展开到代码之后,就成了注释符“//”了,也就是说,如果你原来的代码是DbgPrintf("%d",x);,经过这个宏展开后成了//DbgPrintf("%d",x);,相当于自动在前面加了注释符“//”。要注意的是,续行符后面的“/”一定要顶格写,否则就不是“//”了。另外,这个宏只能单独一行使用,因为它将该行后面的代码都注释掉了。

主要是因为有些编译器它不支持不定长参数宏定义,而printf函数刚好又是一个不定长参数的,所以定义为空宏的办法不好搞,才想出了这个一个把宏变成“//”注释的办法。另外还可以使用
方法二:

//#define DEBUG
#ifdef DEBUG
#define DBG(CODE) CODE
#else
#define DBG(CODE)
#endif

就是写代码的时候,对于调试信息加上DBG,稍微麻烦点,例如

DBG(printf("%d",x);)

这样就不会出什么问题了,而且还可以在里面写很多行代码。
方法三:
#ifdef DEBUG
#define Dbgprintf printf
#else
#define Dbgprintf 0         // 当然也可以用 #define Dbgprintf {}
#endif
粘连(##):将两个符号连接为一个。

例如, #define NEW_VAR(x, y) (x##y)

使用:NEW_VAR(QObject, Private)   宏展开之后成为:QObjectPrivate

粘连的一方不一定必须是宏参数,上面的例子我们也可以改成:

#define NEW_VAR(x) x##Private

使用:NEW_VAR(QObject)   宏展开之后成为:QObjectPrivate

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值