将inline
函数定义放在应该内联到多个其他单元的函数的C头文件中,应该使用inline
或static inline
吗?我在谷歌上搜索了一会儿,但到目前为止似乎还没有对这两者的区别给出简明的解释。
在C语言中内联函数的正确方法如下:
- 在标题 中添加
- 创建一个包含头文件的实现文件
- 在实现文件中放置
extern inline
函数
inline
函数example.h
inline int example(int val) {
return (val << 2) | 1;
}
example.c
#include "example.h"
extern inline int example(int val);
你不能在头文件中声明一个
static inline
,而不使用。c吗?
这将导致在包含头文件的每个翻译单元中有单独的独立函数定义。除了不必要地增加编译代码的大小之外,当您获得指向内联函数的指针时,这会产生一些意想不到的行为:而不是产生相同的地址,在不同的翻译单元中获取的内联函数的地址将产生不同的值。
但是如果保护头文件,可以避免重新定义,不是吗?
不,绝对不是。这与同一个头文件的多个包含无关。每个翻译单元都是与其他翻译单元分开编译的,所以当编译器看到一个静态函数时,它别无选择,只能创建一个在翻译单元外部不可见的私有副本。