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

Tob*_*oby 5 c static inline-functions

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

das*_*ght 15

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

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

example.h文件

inline int example(int val) {
    return (val << 2) | 1;
}
Run Code Online (Sandbox Code Playgroud)

example.c

#include "example.h"

extern inline int example(int val);
Run Code Online (Sandbox Code Playgroud)

你不能只static inline在头文件中声明一个,没有.c吗?

这将导致在包括头部的每个转换单元中的单独的独立功能定义.此外,在不必要地增加编译代码的大小时,当您获得指向内联函数的指针时,这会产生一些意外行为:而不是生成相同的地址,在不同的转换单元中采用的内联函数的地址将产生不同的值.

但如果一个守卫头文件可以避免重新定义,不是吗?

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

  • @PeterVaro否.它与同一标题的多个包含无关 - 这些绝对没问题.每个翻译单元都与其他翻译单元分开编译,因此当编译器看到静态函数时,除了创建从翻译单元外部不可见的私有副本之外别无选择. (3认同)
  • 你不能在没有 .c 的情况下在头文件中声明一个静态内联......吗? (2认同)
  • @Toby在与.h文件匹配的.c文件中,只需要一个`extern inline`。 (2认同)
  • @DrewMcGowen 是的,“extern”是默认限定符。然而,由于“inline”也是一个限定符,因此“extern”再次变得必要,因为默认规则不再适用。 (2认同)