头文件中的内联与静态内联

托比

要将inline函数定义放置在C头文件中,以便将函数内联到多个其他单元中,应该使用inline还是static inline将其使用?我已经搜索了一段时间,但到目前为止,似乎没有简洁的解释。

谢尔盖·卡里尼琴科(Sergey Kalinichenko)

在C中内联函数的正确方法如下:

  • inline在标题中放置一个函数
  • 创建一个包含该标头的实现文件
  • extern inline在实现文件中放置一个函数。

例子.h

inline int example(int val) {
    return (val << 2) | 1;
}

example.c

#include "example.h"

extern inline int example(int val);

您不能static inline在没有.c的标题中声明a吗?

这将在每个包含标题的转换单元中产生独立的独立函数定义。除了不必要地增加已编译代码的大小之外,当您获得指向内联函数的指针时,这还会产生一些意外的行为:在不同转换单元中使用的内联函数的地址会产生不同的值,而不是产生相同的地址。

但是如果有人保护头文件,就可以避免重新定义,不是吗?

不,绝对不是。这与同一标头的多个包含无关。每个翻译单元都与其他翻译单元分开编译,因此,当编译器看到静态函数时,别无选择,只能创建一个从翻译单元外部看不到的私有副本。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章