7

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

4

1 回答 1

19

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

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

例子.h

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

例子.c

#include "example.h"

extern inline int example(int val);

你不能只static inline在标题中声明 a ,而不用 .c 吗?

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

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

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

于 2014-05-16T16:01:38.193 回答