一些特殊用途的宏

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
","good",100);
P_Release("%s:%d
","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"


欢迎光临我的站点----蝴蝶忽然的博客园----人既无名的专栏
假设阅读本文过程中有不论什么问题,请联系作者,转载请注明出处!


版权声明:本文博客原创文章。博客,未经同意,不得转载。

原文地址:https://www.cnblogs.com/mengfanrong/p/4746793.html