最近在看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\n",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);

}

C语言宏定义函数中的“_##”的意思相关推荐

  1. C语言宏定义函数的使用(定义单行和多行)

    要写好C语言,漂亮的宏定义是非常重要的.宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等. 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定 ...

  2. c语言宏定义函数如何调用

    直接调用即可.如下示例: #include<stdio.h> #define sum(b,c){int d=0;d=b+c;printf("两者的和:%d\n",d); ...

  3. c语言 宏定义 去除宏定义_如何检查是否在C中定义了宏?

    c语言 宏定义 去除宏定义 To check whether a Macro is defined or not in C language – we use #ifdef preprocessor ...

  4. 巧用c语言宏定义实现自动注释调试代码,C语言宏定义中的特殊用法

    C宏定义中的特殊用法 在分析一些C源码时,经常会遇到各种宏定义操作,本文即总结一下C语言宏定义中常见的预定义宏.调试宏:宏的条件编译用法及特殊的宏关键字用法. #undef 限定宏的作用域 一般来讲宏 ...

  5. C语言宏定义、宏函数、内置宏与常用宏

    前言: 在C语言中,变量类型.循环控制.基础语法等与其他高级语言基本无异:而C语言(C++)特有的两把双刃剑指针和宏定义/宏函数使得C语言在底层开发中披荆斩棘.无所不能.这两个概念涉及范围比较广,其分 ...

  6. 关于C语言刷题(#define宏定义函数的常见错误)

    关于C语言刷题(#define宏定义函数的常见错误) 首先我们来先看对#define的定义 define,宏定义,C语言中预处理命令一种.分为无参宏定义和带参宏定义.无参宏定义的一般形式为:#defi ...

  7. C语言宏定义中#号的作用

    C语言宏定义中#号的作用 前言 #号的作用 前言 最近,在阅读uboot的源码过程中,发现了一段宏定义代码: #define U_BOOT_CMD_MKENT_COMPLETE(_name, _max ...

  8. c程序语言符号的作用,c语言宏定义中的#,##,#@及\符号的作用

    1.#(stringizing)字符串化操作符 作用:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串.其只能用于有传入参数的宏定   义中,且必须置于宏定义体中的参数名前. 如: #def ...

  9. C语言 define 定义函数(多行书写) - C语言零基础入门教程

    目录 一.define 简介 二.define 定义多行函数 1.简单使用 2.经典案例 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 ...

最新文章

  1. 怎么卸载云骑士装机大师
  2. 在MasterPage下FindControl的使用方法
  3. LeetCode 426. 将二叉搜索树转化为排序的双向链表
  4. CentOS6.5 缺少 libstdc++.so.6(GLIBCXX_3.4.15)
  5. WebAPI返回数据类型
  6. 网站重新解析换服务器,更换解析服务器地址
  7. centos 6 php环境,centos6.6 下 安装 php7 + nginx环境的方法
  8. 数据库的设计与连接、站点的搭建
  9. Linux命令:find
  10. html js修改readonly,js控制html元素的readonly属性
  11. 房间WIFI信号不好怎么办?——无线路由桥接(WDS)
  12. oracle表空间使用情况查看
  13. 大商圈.资本运作 书摘
  14. 获取pc微信信息_如何获取有关您的PC的详细信息
  15. 图像处理:图像特效之油画效果
  16. Matlab多重积分的两种实现【从六重积分到一百重积分】
  17. 基于李雅普诺夫函数的跟踪控制(二)
  18. 苹果Arcade订阅常见问题
  19. python编程玩具有哪些_python 全栈开发,Day133(玩具与玩具之间的对话,基于jieba gensim pypinyin实现的自然语言处理,打包apk)...
  20. 推荐安全且匿名的邮箱 ProtonMail -- PGP算法

热门文章

  1. 吉大计算机研究生996综合,996算什么?来看看研究生究竟有多累
  2. 2022. 12 青少年软件编程(C 语言) 等级考试试卷(一级)
  3. CSDN高校俱乐部申请流程和要求
  4. 泛融云计算机研究院,新基建驱动云计算升级 深圳市泛融云计算研究院成立
  5. 『HTML5梦幻之旅』-滚动播放的幻灯片效果
  6. 使用mobaxterm连接服务器出现连接中断问题
  7. 统计多个wav文件的总音频时长
  8. Flutter网络请求关闭Loading对话框
  9. 服务器开关电源位置,服务器开关电源测试方法及服务器开关电源测试装置
  10. (2022保姆级教程)使用Java向邮箱发送邮件、验证码