c/c++语言开发共享如何正确内联静态库

我正在重写我的一个小C数学库,它最终会成为用户的静态库,并希望从我的矢量数学界面的内联中受益。

我有以下内容:

[mymath.h]

... ... extern float clampf( float v, float min, float max ); ... ... 

[mymath.c]

 inline float clampf( float v, float min, float max ) { if( v  max ) v = max; return v; } 

由于我的库是静态的,我只是要向用户提供.h (和.lib ),在编译时是否会在程序中内联clampf函数?

我做的是正确的事情但是在.h声明了函数extern并且在.c内联了吗?

    你几乎是正确的。 你实际上倒退了; 对于内联函数,您必须将inline定义放在头文件中,并将extern声明放在C文件中。

     // mymath.h inline float clampf( float v, float min, float max ) { if( v < min ) v = min; if( v > max ) v = max; return v; } // mymath.c #include "mymath.h" extern float clampf( float v, float min, float max ); 

    您必须将定义(完整正文)放在头文件中,这将允许任何包含头文件的文件能够在编译器选择时使用内联定义。

    您必须将extern声明(原型)放在源文件中,以告诉编译器在库中发出该函数的外部版本。 这为您的库中的非内联版本提供了一个位置,因此编译器可以在内联函数或使用通用版本之间进行选择。

    请注意,这可能不适用于MSVC编译器,MSVC编译器通常对C的支持非常差(并且几乎没有支持C99)。 对于GCC,您必须为旧版本启用C99支持。 Modern C编译器默认支持此语法。

    替代方案:

    您可以将标题更改为具有static inline版本,

     // mymath.h static inline float clampf(float v, float min, float max) { ... } 

    但是,这不提供函数的非内联版本,因此可能会强制编译器为每个转换单元创建此函数的副本。

    笔记:

    您应该在.h文件中将函数定义为static inline

     static inline float clampf( float v, float min, float max ) { if( v < min ) v = min; if( v > max ) v = max; return v; } 

    .c文件中必须不存在该函数。

    编译器可能决定不内联函数,但使其成为正确的函数调用。 因此,每个生成的.o文件都可能包含该函数的副本。

    需要了解更多c/c++开发分享如何正确内联静态库,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)

      以上就是c/c++开发分享如何正确内联静态库相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(计算机技术网)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请点击右边联系管理员删除。

      如若转载,请注明出处:https://www.ctvol.com/c-cdevelopment/980438.html

      (0)
      上一篇 2021年12月13日
      下一篇 2021年12月13日

      精彩推荐