zoukankan      html  css  js  c++  java
  • C语言宏定义函数中的“_##”的意思

    最近在看google vp9的代码的时候碰到:

    #define intra_pred_sized(type, size)
    void vp9_##type##_predictor_##size##x##size##_c(uint8_t *dst,
    ptrdiff_t stride,
    const uint8_t *above,
    const uint8_t *left) {
    type##_predictor(dst, stride, size, above, left);
    }

    对于define 中 ##的用法的确不知知道,网上找啦很多资料,总结收集如下:

    #define Conn(x,y) x##y
    #define ToChar(x) #@x
    #define ToString(x) #x

    x##y表示什么?表示x连接y,举例说:
    int n = Conn(123,456);   结果就是n=123456;
    char* str = Conn("asdf", "adf")结果就是 str = "asdfadf";
    怎么样,很神奇吧

    再来看#@x,其实就是给x加上单引号,结果返回是一个const char。举例说:
    char a = ToChar(1);结果就是a='1';
    做个越界试验char a = ToChar(123);结果是a='3';
    但是如果你的参数超过四个字符,编译器就给给你报错了!error C2015: too many characters in constant   :P

    最后看看#x,估计你也明白了,他是给x加双引号
    char* str = ToString(123132);就成了str="123132";

    最后留几个小试验给大家去测测:
    #define Dec(x,y) (x-y)
    int n = Dec( A(123,1), 1230);
    n = Conn(123, Conn(123,332) );
    char* str = A("12", ToString( Dec(3,1));
    结果会如何呢? 嘿嘿嘿嘿~

    三.
    #define xxx() {} 
    标准C支持的
    #define xxx() ({})
    GCC新增的功能,主要为了防止宏展开出现问题,默认展开时是要加上一个;的,容易出问题。


    CODE:#define A(a,b,c) ({a=1;b+=1;c=3;a+b+c;})
    #include <stdio.h>
    int main()
    {
           int a;
           int b=1;
           int c;
           int d;
           d=A(a,b,c);
           printf("%d,%d,%d,%d ",a,b,c,d);
           return 0;
    }
    表示该宏函数还有返回值,最后一个式子的返回值作为宏函数的返回值。
    运行结果:
    1,2,3,6

    结合上面说的VP9部分的代码可以解释为如下:

    #define intra_pred_sized(type, size)
    void vp9_##type##_predictor_##size##x##size##_c(uint8_t *dst,
    ptrdiff_t stride,
    const uint8_t *above,
    const uint8_t *left) {
    type##_predictor(dst, stride, size, above, left);
    }

    eg: #define intra_pred_sized(d207, 8*8)      

    void vp9_d207_predictor_8**_c(uint8_t *dst, ptrdiff_t stride, const uint8_t *above, const uint8_t *lef){

      d207_predictor(dst, stride, size, above, left);

    }

  • 相关阅读:
    Linux性能调优
    Linux动态库搜索路径的技巧
    [转]Linux动态库的种种要点
    [转]谈谈Linux下动态库查找路径的问题
    性能测试的几种业务模型设计
    性能测试解惑之并发压力
    一个系统的最大并发用户数为1100,怎么能推算出该系统的支持最大用户数
    IP欺骗
    关于Cocos2d-x随机数的生成
    关于Cocos2d-x节点和精灵节点的坐标、位置以及大小的设置
  • 原文地址:https://www.cnblogs.com/biglucky/p/3741124.html
Copyright © 2011-2022 走看看