gpt4 book ai didi

c - 如何正确内联静态库

转载 作者:太空狗 更新时间:2023-10-29 16:33:49 24 4
gpt4 key购买 nike

我正在重写我的一个小型 C 数学库,它最终将成为用户的静态库,并希望从我的 vector 数学接口(interface)的内联中受益。

我有以下内容:

[ mymath.h ]

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

[ mymath.c ]

inline float clampf( float v, float min, float max )
{
if( v < min ) v = min;
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 声明(原型(prototype))放在源文件中,以告诉编译器发出库中函数的外部版本。这在您的库中为非内联版本提供了一个位置,因此编译器可以选择内联函数或使用通用版本。

请注意,这可能不适用于 MSVC 编译器,它对 C 的支持通常很差(对 C99 的支持几乎为零)。对于 GCC,您必须为旧版本启用 C99 支持。现代 C 编译器默认支持此语法。

替代方案:

您可以更改 header 以具有static inline 版本,

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

但是,这不提供该函数的非内联版本,因此编译器可能被迫为每个翻译单元创建该函数的副本。

注意事项:

  1. C99 内联规则并不十分直观。文章“Inline functions in C”(mirror) 详细描述了它们。特别是,跳到底部并查看“使用内联函数的策略”。我更喜欢方法 #3,因为 GCC 已经默认使用 C99 方法一段时间了。

  2. 从技术上讲,您永远不需要将 extern 放在函数声明(或定义)中,因为 extern 是默认值。我把它放在那里是为了强调。

关于c - 如何正确内联静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10291581/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com