目录
2 FF_DISABLE_DEPRECATION_WARNINGS宏
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,重新编译,将产生如下输出: