zoukankan      html  css  js  c++  java
  • 一些特殊用途的宏

    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"


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


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

  • 相关阅读:
    Fiddler (五) Mac下使用Fiddler
    Fiddler (三) Composer创建和发送HTTP Request
    Fiddler (二) Script 用法
    微信公众平台关于fakeid和openid的解析
    Fiddler 教程
    win7系统旗舰版path
    HTML 限制文本框只能输入特定字符(比如数字 onkeyup+onafterpaste)
    get传递中文产生乱码的解决方式汇总
    get/post时中文乱码问题的解决办法
    Exception loading sessions from persistent storage
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4746793.html
Copyright © 2011-2022 走看看