标签:
在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); }
在缺省情况下。编译器为每个变量或是数据单元按其自然对界条件分配空间。一般地。能够通过以下的方法来改变缺省的对界条件:
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)))
我们指定,有些函数的參数是可变的,比如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);
#
,##
,#@
的差别如果定义3个宏,
#define A(x) T_##x #define B(x) #@x #define C(x) #x
则以下展开后为
A(1)------>T_1
B(1)------>‘1‘
C(1)------>"1"
欢迎光临我的站点----蝴蝶忽然的博客园----人既无名的专栏。
假设阅读本文过程中有不论什么问题,请联系作者,转载请注明出处!
版权声明:本文博客原创文章。博客,未经同意,不得转载。
标签:
原文地址:http://www.cnblogs.com/mengfanrong/p/4746793.html