实际的ffmpeg设计:
if (ARCH_ALPHA)
ff_me_cmp_init_alpha(c, avctx);
if (ARCH_ARM)
ff_me_cmp_init_arm(c, avctx);
if (ARCH_PPC)
ff_me_cmp_init_ppc(c, avctx);
if (ARCH_X86)
ff_me_cmp_init_x86(c, avctx);
if (ARCH_MIPS)
ff_me_cmp_init_mips(c, avctx);
良好的简单设计:
if (ARCH_ALPHA)
ff_me_cmp_init_alpha(c, avctx);
if (ARCH_ARM)
ff_me_cmp_init_arm(c, avctx);
if (ARCH_PPC)
ff_me_cmp_init_ppc(c, avctx);
if (ARCH_X86)
ff_me_cmp_init_x86(c, avctx);
if (ARCH_MIPS)
ff_me_cmp_init_mips(c, avctx);
良好的扩展设计:
#if (ARCH_ALPHA)
ff_me_cmp_init_alpha(c, avctx);
#elif (ARCH_ARM)
ff_me_cmp_init_arm(c, avctx);
#elif (ARCH_PPC)
ff_me_cmp_init_ppc(c, avctx);
#elif (ARCH_X86)
ff_me_cmp_init_x86(c, avctx);
#elif (ARCH_MIPS)
ff_me_cmp_init_mips(c, avctx);
#endif
为什么FFmpeg不使用好的简单/扩展设计是个谜...
如果有人同时将ARCH_ALPHA和ARCH_ARM定义为1,这是没有意义的,但代码将会在VS下编译(具有奇怪的行为)。
说:
if (0) C;比#if或#ifdef解决方案的一个优点是代码仍然经过类型检查
对于使用VS编译的FFmpeg来说只是愚蠢的。如果你不需要ALPHA/ARM/PPC/X86/MIPS/...,为什么还要编译它呢?
if ([A-Z_]*)
来查找所有可能需要修改的站点(这将查找所有仅由大写字母和下划线组成的if
条件)。 - Pascal Cuoq