C 为什么可能需要包含一个源文件?
我要在嵌入式设备中移植C 为什么可能需要包含一个源文件?,c,C,我要在嵌入式设备中移植h264编解码器。ffmpeg源代码使用以下结构: #undef CHROMA_IDC #define CHROMA_IDC 3 #include "h264_mc_template.c" static av_noinline void FUNC(hl_decode_mb_444)(const H264Context *h, H264SliceContext *sl) { ... } 为什么我需要包含这样一个源文件?“模板”后缀提示代码依赖于某些预处理器指令
h264
编解码器。ffmpeg源代码使用以下结构:
#undef CHROMA_IDC
#define CHROMA_IDC 3
#include "h264_mc_template.c"
static av_noinline void FUNC(hl_decode_mb_444)(const H264Context *h, H264SliceContext *sl)
{
...
}
为什么我需要包含这样一个源文件?“模板”后缀提示代码依赖于某些预处理器指令
我查了一下,开始的时候
#if CHROMA_IDC == 1
# define MCFUNC(n) FUNC(n ## _420)
#elif CHROMA_IDC == 2
# define MCFUNC(n) FUNC(n ## _422)
#elif CHROMA_IDC == 3
# define MCFUNC(n) FUNC(n ## _444)
#endif
请注意,在包含此文件之前,您必须定义色度(IDC 3)
这告诉预处理器在包含的文件中使用define MCFUNC(n)FUNC(n###u 444)
源文件可以单独保存在makefile中,但有一个-DCHROMA_IDC=3
指令,在这种情况下,由于多次重新定义,模板不能用于其他源文件(此源文件中的函数是静态的
,以避免模板多次实例化时出现多次重新定义)
为什么要使用模板?可能是为了解决性能问题,以避免调用链和一些针对所需行为的分支测试
ffmpeg
无法承受编码功能的缓慢。那么,为什么要包含C文件呢?恐怕这个问题对我来说有点难以理解。h264\u mc\u模板。c
必须依赖于CHROMA\u IDC
,因此它需要包含以生成正确的代码。红豆杉的意思是为什么包含源文件?c!=C++。只使用您正在使用的语言进行标记,除非两者实际上都相关。