首页 > 代码库 > 宏的几种特殊用法
宏的几种特殊用法
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"
欢迎光临我的网站----蝴蝶忽然的博客园----人既无名的专栏。
如果阅读本文过程中有任何问题,请联系作者,转载请注明出处!