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);

    }

  • 相关阅读:
    PATA 1071 Speech Patterns.
    PATA 1027 Colors In Mars
    PATB 1038. 统计同成绩学生(20)
    1036. 跟奥巴马一起编程(15)
    PATA 1036. Boys vs Girls (25)
    PATA 1006. Sign In and Sign Out (25)
    读取web工程目录之外的图片并显示
    DOS命令
    java连接oracle集群
    servlet
  • 原文地址:https://www.cnblogs.com/biglucky/p/3741124.html
Copyright © 2011-2022 走看看