C++头文件里的内联函数加不加static有什么区别?

看网上说要加static,可是我不加好像也没有问题? 这是我的测试代码: // my_inline_function.h #ifndef MY_INL…
关注者
39
被浏览
16,787

13 个回答

inline 是加在头文件内的,用于声明「这个函数虽然定义在头文件内,但多个编译实体中只保留一份」。

static 是加在源文件里边的,用于声明「这个函数仅用于当前源文件,其它编译实体不可用」。

两者没有任何相干,而且不应该同时使用,一个用于.h,一个用于.cpp。

头文件里定义的函数,当然只能用 inline 不能用 static。

题主是不是又看了啥奇奇怪怪的教材?

在 C++ 代码里写(希望)内联的函数不要加 static。在 C++ 代码里写(希望)内联的函数不要加 static。在 C++ 代码里写(希望)内联的函数不要加 static。

static inline 只在纯 C 的世界里有一定意义(此处不讨论),在 C++ 的世界里完全不推荐。在 C++ 里,inline 已经表示了这个符号允许存在多份定义(前提:所有定义必须相同,否则是未定义行为)。链接器会在没有实际发生内联时(如果函数太复杂;或者优化级别或者编译选项不允许内联),合并重复的定义,只保留一份编译结果。

如果写了 static,那在没有发生内联时,最终的链接结果里就会出现多份重复代码。更糟糕的是,如果你的函数里有 static 变量时(定义单例往往会使用这种写法),函数前写了 static 语义就错误了——每个使用这个函数的 .cpp 文件都会有自己的一份变量,而不是整个程序只有一份。

P.S. 我说“希望内联”,因为 inline 不保证内联。所以 inline 在现代 C++ 里更适合理解为应该把实体(函数和变量)的定义放头文件里。我们现在不仅有 inline 函数,还有 inline 变量。