zoukankan      html  css  js  c++  java
  • ffmpeg

    在ffmpeg中,这个文件被很多其他的文件所包含。该文件中定义了一些gcc中支持的语言扩展的宏,

    例如强制内联,外部内联,pure函数等。并根据是否使用了GCC,以及GCC的版本,把宏转换为

    相应的编译器扩展 选项。某些选项也支持msvc。

    关键点:

      1.__GNUC__:是GCC编译器预定义的标志,值是GCC的主版本。

      2.__GNUC_MINOR__:是GCC编译器预定义的标志,值是GCC的小版本

      3.AV_GCC_VERSION_AT_LEAST(x,y):当编译器是GCC,且版本大于x.y时返回true

      4.__attribute__是GCC的编译器扩展属性定义的关键字 语法:__attribute__((attr))

      5.__attribute__((always_inline))表示GCC强制内联

      6.__forceinline是msvc的编译器扩展,表示强制内联

      7.__attribute__((noinline))避免编译器进行内联优化。

    /*
     * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
     *
     * This file is part of FFmpeg.
     *
     * FFmpeg is free software; you can redistribute it and/or
     * modify it under the terms of the GNU Lesser General Public
     * License as published by the Free Software Foundation; either
     * version 2.1 of the License, or (at your option) any later version.
     *
     * FFmpeg is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     * Lesser General Public License for more details.
     *
     * You should have received a copy of the GNU Lesser General Public
     * License along with FFmpeg; if not, write to the Free Software
     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     */
    
    /**
     * @file
     * Macro definitions for various function/variable attributes
     */
    
    #ifndef AVUTIL_ATTRIBUTES_H
    #define AVUTIL_ATTRIBUTES_H
    
    /*鉴别GCC,并保证的最低版本*/ #ifdef __GNUC__ # define AV_GCC_VERSION_AT_LEAST(x,y) (__GNUC__
    > x || __GNUC__ == x && __GNUC_MINOR__ >= y) #else # define AV_GCC_VERSION_AT_LEAST(x,y) 0 #endif
    /*定义强制内联,支持msvc编译器*/ #ifndef av_always_inline
    #if AV_GCC_VERSION_AT_LEAST(3,1) # define av_always_inline __attribute__((always_inline)) inline #elif defined(_MSC_VER) # define av_always_inline __forceinline #else # define av_always_inline inline #endif #endif
    /* __ICL: 鉴别Intel 编译器
    * __GNUC_STDC_INLINE__ 鉴别GCC把C99 inline作为默认机制
    * 

       * 大家一定对C语言 inline 关键字不陌生,甚至经常用到 static inline 的函数。可能感到陌生的是 extern inline。C11 标准在6.7.4 p7 中对此进行了描述,不过比较生涩难读。简单地讲,static line 和 extern inline 的区别,从名字上也能看得出来,就是编译单元之外    * 可见性的问题。把一个普通函数给内联掉之后,一个显著的区别就是外部可见性没了,怎么能同时既能内联又能保留外部的可见性呢?为了解决这个问题就有了extern inline。

    
    

       * static inline 是说这个函数就这么一个,而且没有外部可见性,在所有的编译单元中大家必须共用这么一个定义,这也是为什么 static inline 通常要放到头文件中的原因;而 extern inline 就不一样了,它是说这个函数虽然只有一个定义,但是既有内联的版本,也有非内联的版    * 本,如果你能看得到它的定义。即在同一个编译单元中,那么你就可以用它的内联版本;看不到的话,你就可以用非内联版本,即和其它普通函数一模一样。

    
    

       * 而如果既不带 static 也不带 extern 的话,含义又不同了:前面的 extern inline 只需要定义一次,只是不同的地方看到的版本不同,有的地方看到的是内联的版本,而有的地方看到的只是个 external reference。而仅用 inline 的话,就变成了要定义两次,带 inline 关键    * 字的这个定义就是内联版本,在这个编译单元中都用这个版本,而在外部,还是使用普通的非内联定义。换句话说,带 inline 的定义遮盖住了外部的定义。既然有两个不同的版本,那么也就需要保持这两个版本的定义相同,否则就会有问题。

     */
    #ifndef av_extern_inline
    #if defined(__ICL) && __ICL >= 1210 || defined(__GNUC_STDC_INLINE__)
    #    define av_extern_inline extern inline
    #else
    #    define av_extern_inline inline
    #endif
    #endif
    
    /*禁止内联*/ #if AV_GCC_VERSION_AT_LEAST(3,1) # define av_noinline __attribute__((noinline)) #else # define av_noinline #endif
    /*声明pure函数
    *很多函数除了返回值外没有作用,而且它们的返回值只取决于参数和/或全局变量。这样的一个函数可能依附于普通的子表达式的消除和循环的优化,就像一个算术操作符那样。这些函数应该用属性pure来声明。  
    */ #if AV_GCC_VERSION_AT_LEAST(3,1) # define av_pure __attribute__((pure)) #else # define av_pure #endif
    /*restrict用于限定指针,表明该指针所指向的内存只能通过该指针进行访问,有助于编译器优化*/ #ifndef av_restrict
    #define av_restrict restrict #endif
    /*定义const函数 有助于编译器优化*/ #if AV_GCC_VERSION_AT_LEAST(2,6) # define av_const __attribute__((const)) #else # define av_const #endif
    /*与hot相反,这个属性表示该函数不常用,可以避免被分支预测预读*/ #if AV_GCC_VERSION_AT_LEAST(4,3) # define av_cold __attribute__((cold)) #else # define av_cold #endif
    /*被修饰函数中的所有函数调用将被按照内联展开,具体是否可以被展开取决于函数的尺寸等*/ #if AV_GCC_VERSION_AT_LEAST(4,1) # define av_flatten __attribute__((flatten)) #else # define av_flatten #endif
    /*用于标记不推荐使用的变量,函数等。如果使用,则会产生警告*/ #if AV_GCC_VERSION_AT_LEAST(3,1) # define attribute_deprecated __attribute__((deprecated)) #else # define attribute_deprecated #endif /** * Disable warnings about deprecated features * This is useful for sections of code kept for backward compatibility and * scheduled for removal. */

    /**
    * 关闭一段已经设置为不推荐使用的代码的编译警告
    */
    #ifndef AV_NOWARN_DEPRECATED #if AV_GCC_VERSION_AT_LEAST(4,6) # define AV_NOWARN_DEPRECATED(code) _Pragma("GCC diagnostic push") _Pragma("GCC diagnostic ignored "-Wdeprecated-declarations"") code _Pragma("GCC diagnostic pop") #else # define AV_NOWARN_DEPRECATED(code) code #endif #endif #if defined(__GNUC__) # define av_unused __attribute__((unused)) #else # define av_unused #endif /** * Mark a variable as used and prevent the compiler from optimizing it * away. This is useful for variables accessed only from inline * assembler without the compiler being aware. * 标记该符号被使用,以免被优化掉,在使用内联汇编时需要使用。
    */
    #if AV_GCC_VERSION_AT_LEAST(3,1) # define av_used __attribute__((used)) #else # define av_used #endif
    /*在使用-fstrict-aliasing选项(-02的默认选项)编译时,对于指向相关内存地址的变量会产生编译错误。使用may_alias可以避免这个编译错误。*/ #if AV_GCC_VERSION_AT_LEAST(3,3) # define av_alias __attribute__((may_alias)) #else # define av_alias #endif
    /*处理未初始化的量*/ #if defined(__GNUC__) && !defined(__INTEL_COMPILER) && !defined(__clang__) # define av_uninit(x) x=x #else # define av_uninit(x) x #endif
    /*为带format串的函数提供编译时的类型检查*/ #ifdef __GNUC__ # define av_builtin_constant_p __builtin_constant_p # define av_printf_format(fmtpos, attrpos) __attribute__((__format__(__printf__, fmtpos, attrpos)))
    #else # define av_builtin_constant_p(x) 0 # define av_printf_format(fmtpos, attrpos) #endif #if AV_GCC_VERSION_AT_LEAST(2,5) # define av_noreturn __attribute__((noreturn)) #else # define av_noreturn #endif #endif /* AVUTIL_ATTRIBUTES_H */
  • 相关阅读:
    django 添加字段, migrate时候生成一个默认值
    django 开发经验
    GeoIP2-python
    一些好用的django模块
    ubuntu linux samba
    动画工作室
    以太坊dApp全栈开发教程(引言)
    社交网络去中心化已成趋势,读懂核心底层技术选择和路线
    CryptoCurrency Security Standard (CCSS)
    HARNESS THE POWER OF DISTRIBUTED STORAGE IPFS AND SWARM IN ETHEREUM BLOCKCHAIN APPLICATIONS
  • 原文地址:https://www.cnblogs.com/zxlben/p/3421909.html
Copyright © 2011-2022 走看看