一些特殊用途的宏
2015-08-21 08:44
387 查看
1. 屏蔽“未使用參数”警告
在OceanBase中ob_define.h中就使用了这样的宏,将传入的数据强制转化为void型。#ifndef UNUSED #define UNUSED(v) ((void)(v)) #endif
这样的宏主要是为了屏蔽“未使用參数”的警告,如以下这个函数用两个參数。可是一个都不用的话,某些编译器就会报出警告:觉得p和mod_id都没有使用。
全部我们使用
UNUSE宏,这样两个參数都被使用了,可是实际上没有做不论什么有效的动作,以此来屏蔽“未使用參数”警告。
virtual void mod_free(void* p, const int32_t mod_id = 0) { UNUSED(p); UNUSED(mod_id); }
2. 指定字节对齐
在缺省情况下。编译器为每个变量或是数据单元按其自然对界条件分配空间。一般地。能够通过以下的方法来改变缺省的对界条件:1) 使用伪指令
#pragma pack (n)。编译器将依照n个字节对齐。
2) 使用伪指令
#pragma pack (),取消自己定义字节对齐方式。
另外,还有例如以下的一种方式:
3)
__attribute__((aligned (n)))。让所作用的结构成员对齐在n字节自然边界上。假设结构中有成员的长度大于n。则依照最大成员的长度来对齐。
4)
__attribute__ ((packed)),取消结构在编译过程中的优化对齐,依照实际占用字节数进行对齐。
以上的n = 1, 2, 4, 8, 16... 第一种方式较为常见。
#define CACHE_ALIGNED __attribute__((aligned(CACHE_ALIGN_SIZE)))
3. 可变參数宏
我们指定,有些函数的參数是可变的,比如printf函数。指定第一个为格式化字符串以后。后面能够跟个数不定的參数,相同。宏也能够指定多个參数。有两种方法能够做到。一是使用
args...和
##args,二是使用
...和
__VA_ARGS__。以下是两种方式定义的两个宏。这两个宏都能在printf字符串前。先输出一个字符串。达到同样的效果。
#define P_Debug(format,args...) \ {\ printf("[DeBug]");\ printf(format,##args);\ }while(false) #define P_Release(format,...) \do{\ printf("[Release]");\ printf(format,__VA_ARGS__);\ }while(false)
使用的时候为:
P_Debug("%s:%d\n","good",100); P_Release("%s:%d\n","good",100);
4. #
,##
,#@
的差别
如果定义3个宏,#define A(x) T_##x #define B(x) #@x #define C(x) #x
则以下展开后为
A(1)------>T_1
B(1)------>'1'
C(1)------>"1"
欢迎光临我的站点----蝴蝶忽然的博客园----人既无名的专栏。
假设阅读本文过程中有不论什么问题,请联系作者,转载请注明出处!
相关文章推荐
- 第一章:机器学习基础
- js中操作时间
- 机器学习资源
- Android Studio App设置Activity背景图片
- Round Numbers(组合数学)
- OC:内存管理、dealloc方法、copy知识点
- Round Numbers(组合数学)
- eclipse +maven+web应用 +tomcat jar包加载
- 【NOIP2001P/codevs1014】 装箱问题 解题报告
- jQuery实现大转盘抽奖活动仿QQ音乐代码分享
- 创建一个完整的窗口需要的步骤:4步
- OFTP说明
- 项目EasyUi和JS中遇到的问题总汇
- HDU 5414 CRB and String (2015年多校比赛第10场)
- [iOS备忘录]使用蓝牙耳机headset录音
- SVN与GIT
- HDU 5411(矩阵快速幂)
- poj1095--Trees Made to Order(卡特兰数)
- 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用
- WordPress主题制作教程[壹] - 了解WP&结构&索引