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

    }

  • 相关阅读:
    memcached 服务器安装
    农行接口开发
    mysql备份
    IIS下的FTP使用
    建行接口
    Android网络编程之一个Android下菜单系统模块的实现(客户端—更新菜单)
    Android网络编程之一个Android下菜单系统模块的实现(客户端—更新桌号)
    Android网络编程之下菜单系统中的真机调试问题小结
    Android网络编程之一个Android下菜单系统模块的实现(服务器端—更新桌号)
    Android之一个简单的Activity启动画面
  • 原文地址:https://www.cnblogs.com/biglucky/p/3741124.html
Copyright © 2011-2022 走看看