FFMPEG4.1源码分析之 过时代码管理 attribute_deprecated

目录

0 FFMPEG过时代码管理

1 attribute_deprecated

1.1 定义

1.2 作用

2 FF_DISABLE_DEPRECATION_WARNINGS宏

2.1 定义

2.1 作用

3 示例


0 FFMPEG过时代码管理


FFMPEG中对于过时,以及即将在未来某个版本中将去掉的某些API和变量,一般采取如下做法

  • 在库的version.h头文件中声明一个宏定义。比如libavformat库version.h中的FF_API_NEXT
  • 将过时代码的声明在 #if FF_API_NEXT....#endif中,并且以关键字attribute_deprecated修饰声明。比如attribute_deprecated
    void av_register_all(void);
  • 将过时代码定义在#if FF_API_NEXT....#endif中,并且以FF_DISABLE_DEPRECATION_WARNINGS开头,以FF_ENABLE_DEPRECATION_WARNINGS结尾,比如:
#if FF_API_NEXT
FF_DISABLE_DEPRECATION_WARNINGS

void av_register_all(void)
{
    ff_thread_once(&av_format_next_init, av_format_init_next);
}

FF_ENABLE_DEPRECATION_WARNINGS
#endif

1 attribute_deprecated


1.1 定义

在FFMPEG中,attribute_deprecated被定义为如下:不同的编译器环境,attribute_deprecated被映射为不同关键字

#if AV_GCC_VERSION_AT_LEAST(3,1)
#    define attribute_deprecated __attribute__((deprecated))
#elif defined(_MSC_VER)
#    define attribute_deprecated __declspec(deprecated)
#else
#    define attribute_deprecated
#endif
  • GCC编译器的3.1及以上版本,attribute_deprecated相当于__attribute__((deprecated));
  • MSVC编译器,attribute_deprecated相当于__declspec(deprecated);
  • 其他:attribute_deprecated

1.2 作用


作用描述:在http://www.keil.com/support/man/docs/armcc/armcc_chr1359124981701.htm篇文章中,对__attribute__((deprecated)) 描述如下:“ The deprecated variable attribute enables the declaration of a deprecated variable without any warnings or errors being issued by the compiler. However, any access to a deprecated variable creates a warning but still compiles. The warning gives the location where the variable is used and the location where it is defined. This helps you to determine why a particular definition is deprecated.” 

中文释义:如果被变量或者函数的声明使用deprecated属性进行描述,那么编译器编译过程中不会产生警告或者错误,但是,被该属性描述的变量或者函数在其他地方被调用,那么编译会产生警告,警告信息中包含过时接口定义的位置及代码中的引用位置。

2 FF_DISABLE_DEPRECATION_WARNINGS宏


2.1 定义


FFMPEG中FF_DISABLE_DEPRECATION_WARNINGS和FF_ENABLE_DEPRECATION_WARNINGS分别在不同的编译器环境下对应不同的宏,如下源码所示:

#if HAVE_PRAGMA_DEPRECATED
#    if defined(__ICL) || defined (__INTEL_COMPILER)
#        define FF_DISABLE_DEPRECATION_WARNINGS __pragma(warning(push)) __pragma(warning(disable:1478))
#        define FF_ENABLE_DEPRECATION_WARNINGS  __pragma(warning(pop))
#    elif defined(_MSC_VER)
#        define FF_DISABLE_DEPRECATION_WARNINGS __pragma(warning(push)) __pragma(warning(disable:4996))
#        define FF_ENABLE_DEPRECATION_WARNINGS  __pragma(warning(pop))
#    else
#        define FF_DISABLE_DEPRECATION_WARNINGS _Pragma("GCC diagnostic push") _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
#        define FF_ENABLE_DEPRECATION_WARNINGS  _Pragma("GCC diagnostic pop")
#    endif
#else
#    define FF_DISABLE_DEPRECATION_WARNINGS
#    define FF_ENABLE_DEPRECATION_WARNINGS
#endif

2.1 作用


以msvc编译器为例:FF_DISABLE_DEPRECATION_WARNINGS __pragma(warning(push)) __pragma(warning(disable:4996))

define FF_ENABLE_DEPRECATION_WARNINGS  __pragma(warning(pop));从上面信息可以得知出现FF_DISABLE_DEPRECATION_WARNINGS的时候,号码为4996的警告将失效,一直到FF_ENABLE_DEPRECATION_WARNINGS出现。由此可以得到两个结论

  • 以上诉两个宏包围的代码,编译过程中将不会报4996的警告
  • 在msvc的编译环境中,deprecated属性所产生的警告号是4996

3 示例


测试源码如下:

#include <stdio.h>
#include <stdlib.h>

#ifdef __GNUC__
#    define GCC_VERSION_AT_LEAST(x,y) (__GNUC__ > (x) || __GNUC__ == (x) && __GNUC_MINOR__ >= (y))
#else
#    define GCC_VERSION_AT_LEAST(x,y) 0
#endif

#if GCC_VERSION_AT_LEAST(3,1)
#    define attribute_deprecated __attribute__((deprecated))
#elif defined(_MSC_VER)
#    define attribute_deprecated __declspec(deprecated)
#else
#    define attribute_deprecated
#endif

#define FF_DISABLE_DEPRECATION_WARNINGS __pragma(warning(push)) __pragma(warning(disable:4996))
#define FF_ENABLE_DEPRECATION_WARNINGS  __pragma(warning(pop))

/* Variable Attribute */
attribute_deprecated 
int  variable_old = 0;

/* Function Attribute */
attribute_deprecated 
void function_old(void);

void function_old(void)
{
    printf("old function.\n");
    return;
}

int main(void)
{
    variable_old++;

    function_old();

    return 0;
}

1. 在vs下编译该代码,将产生如下输出:

2. 在注释掉main函数中variable_old++;这行代码后,重新编译,将产生如下输出:

3. 若放开所有注释,给函数function_old();前后分别加上FF_DISABLE_DEPRECATION_WARNINGS和FF_ENABLE_DEPRECATION_WARNINGS,重新编译,将产生如下输出:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值