4-26 pixel赋值问题 mbcmp函数 宏定义
知识点
1. 宏中的 ## 和 #
首先明白宏就是替换 ## 就是连接替换中的参数
例子1
如果你有几个参数有相关作用,为了区别用param1,param2,param3表示,用这个宏可以只传递1,2,3就可以输出每一个你想要的参数
//类似于c++中多态的作用
#define TEST1(id) cout<<param##id<<endl;
void main()
{
int param1 = 1, param2 = 2, param3 = 3;
TEST1(1);
TEST1(2);
TEST1(3);
}
单个的#就是在参数两侧加上””
2.\多行的宏定义
3.缺少参数时候可以在宏里面使用##但是不可以直接缺少参数
下面这种情况不能够通过编译
#define TEST2( a, b ) cout<<a<<b
void main()
{
int e = 1,b=2;
TEST2( e, );
}
这个就可以,输出1
#define TEST( a, b ) cout<<a##b
void main()
{
int e = 1,b=2;
TEST( e, );
}
Pixel.c中的宏定义
INT8 ( satd )
INT8 ( sad )
//这a里¤?就¨ª是º?上¦?面?说¦Ì的Ì?那?种?情¨¦况? 缺¨¡À少¦¨´参?数ºy 但Ì?是º?可¨¦以°?看¡ä到Ì? 其?实º¦Ìcpu就¨ª是º?在¨²别Àe的Ì?宏¨º里¤?面?通ª¡§过y##使º1用®?的Ì?
#define INT8( name, cpu ) INT8_NAME( name, name, cpu )
#define INT8_NAME ( name1, name2, cpu ) \
INT7_NAME( name1, name2, cpu) \
pixf->name1[PIXEL_4x16] = x264_pixel_##name2##_4x16##cpu
//第二行容易理解,但是INT7_NAME 和 INT8_NAME 中相同,一直调用其他的
所以先分析INT2_NAME
#define INIT2_NAME( name1, name2, cpu ) \
pixf->name1[PIXEL_16x16] = x264_pixel_##name2##_16x16##cpu;\
pixf->name1[PIXEL_16x8] = x264_pixel_##name2##_16x8##cpu;
#define INIT4_NAME( name1, name2, cpu ) \
INIT2_NAME( name1, name2, cpu ) \
pixf->name1[PIXEL_8x16] = x264_pixel_##name2##_8x16##cpu;\
pixf->name1[PIXEL_8x8] = x264_pixel_##name2##_8x8##cpu;
#define INIT5_NAME( name1, name2, cpu ) \
INIT4_NAME( name1, name2, cpu ) \
pixf->name1[PIXEL_8x4] = x264_pixel_##name2##_8x4##cpu;
#define INIT6_NAME( name1, name2, cpu ) \
INIT5_NAME( name1, name2, cpu ) \
pixf->name1[PIXEL_4x8] = x264_pixel_##name2##_4x8##cpu;
#define INIT7_NAME( name1, name2, cpu ) \
INIT6_NAME( name1, name2, cpu ) \
pixf->name1[PIXEL_4x4] = x264_pixel_##name2##_4x4##cpu;
#define INIT8_NAME( name1, name2, cpu ) \
INIT7_NAME( name1, name2, cpu ) \
pixf->name1[PIXEL_4x16] = x264_pixel_##name2##_4x16##cpu;
//INT8(satd) 展开后
pixf->name1[PIXEL_16x16] = x264_pixel_satd_16x16;
pixf->name1[PIXEL_16x8] = x264_pixel_satd_16x8;
pixf->name1[PIXEL_8x16] = x264_pixel_satd_8x16;
//下面依次的调用到INT2_NAME
最开始调用的是 h->pixf.intra_mbcmp_x3_16x16( p_src, p_dst, a->i_satd_i16x16_dir );
初始化的时候 h->pixf.intra_mbcmp_x3_16x16 = satd ? h->pixf.intra_satd_x3_16x16 : h->pixf.intra_sad_x3_16x16;
转载于:https://www.cnblogs.com/hatreds/archive/2012/04/27/2473343.html
4-26 pixel赋值问题 mbcmp函数 宏定义相关推荐
- 函数宏定义 与函数自定义
为什么在C语言中要有函数宏定义这种形式呢?宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等. 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏 ...
- C 宏定义及函数宏定义
C语言宏定义 参考连接: https://blog.csdn.net/u013910522/article/details/22672057https://www.cnblogs.com/bytebe ...
- 宏函数(宏定义)使用注意
前言 一些经常使用的简单函数,我们会把他定义为宏函数,宏函数确实具有一些优势,本文将讲述宏函数的使用方法和重点踩坑. 使用方便 提高系统运行效率:宏函数并不是真正的函数,只是把语句嵌在其他函数内, ...
- velocity 函数宏定义
定义函数 #macro(函数名 参数1 参数2) #macro(macroName arg1 arg2 -) ... #end ## 处理workspace函数#macro(dealWorkspac ...
- C语言开发必会 宏定义、宏函数
文章目录 宏定义 宏函数 宏定义之闰年判断 宏定义 宏定义是C中三种预处理方式(宏定义.文件包含.条件编译)的一种,只做替换.不求解. 宏定义分为有参宏定义和无参宏定义两种.应特别注意有参宏定义的括号 ...
- c语言宏定义(c语言宏定义是什么意思)
C语言宏定义名可以有括号和分号吗? 宏定义的名称,是C语言标识符的一种,和函数名,变量名的命名规则是一样的,只允许使用数字,字母,下划线,且不能以数字开头. 所以宏名是不可以有括号和分号的. 另外,在 ...
- Python函数的定义和使用教程
def test(x): # x代表形参'''2*x+1:param x:整形数字:return:返回计算结果'''y = 2*x+1return y p = test(3) # test()表示运行 ...
- Python函数的定义和使用
def test(x): # x代表形参'''2*x+1:param x:整形数字:return:返回计算结果'''y = 2*x+1return y p = test(3) # test()表示运行 ...
- 转 C++宏定义详解
来自:传送门 C++宏定义详解 一.#define的基本用法 #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往 ...
- C中的预编译宏定义-转
C中的预编译宏定义 2009-02-10 作者: infobillows 来源:网络 在将一个C源程序转换为可执行程序的过程中, 编译预处理是最初的步骤. 这一步骤是由预处理器(preprocesso ...
最新文章
- 论文浅尝 | 利用指针生成网络的知识图谱自然语言生成
- Java集合 Collection
- Ubuntu 18.04-20.04开机自动root用户登录(测试可用)
- 下载丨53页PDF,云和恩墨技术通讯(2021年4月刊)
- 推荐一款代码神器,代码量至少省一半! 1
- python数组初始化_Python科学计算库Numpy数组的初始化和基本操作
- 乒乓球单循环赛_乒乓球单循环赛积分表(比赛规则、对比表)
- Java并发练习:无锁编程
- linux cat命令使用方法,Linux cat命令怎么使用
- opencv3颜色识别(C++)
- 诗和远方其实并不遥远
- 央企控股及并购重组概念股名单
- ks 曲线_ROC曲线与KS曲线的理解
- Problem 2 慢跑问题
- 微信公众号图文中怎么下载封面图?
- Golang Cannot use ss(type AAA) as type AAA in map index
- Integer.valueOf、intValue、Integer.parseInt使用
- 【文集】Unity的热更新
- 用Matlab仿真手写绘图板上的电压分布
- angular5+动态设置页面标题title