c - "static"和 "static inline"函数有什么区别?

标签 c inline

IMO 都使函数只具有翻译单元的范围。

“静态”和“静态内联”函数有什么区别?

为什么inline要放在头文件中,而不是放在.c文件中?

最佳答案

默认情况下,内联定义仅在当前翻译单元中有效。

如果存储类是extern,则标识符有外部链接,内联定义也提供外部定义。

如果存储类是static,则标识符有内部链接,内联定义在其他翻译单元中是不可见的。

如果未指定存储类,则内联定义仅在当前翻译单元中可见,但标识符仍具有外部链接,必须在不同的翻译单元中提供外部定义。如果在当前翻译单元中调用函数,编译器可以自由使用内联或外部定义。

因为编译器可以自由内联(和不内联)任何其定义在当前翻译单元中可见的函数(并且,由于链接时优化,即使在不同的翻译单元中,尽管 C 标准不真正考虑到这一点),对于大多数实际用途,staticstatic inline 函数定义之间没有区别。

inline 说明符(如register 存储类)只是一个编译器提示,编译器可以完全忽略它。符合标准的非优化编译器只需要考虑它们的副作用,而优化编译器将在有或没有明确提示的情况下进行这些优化。

不过,

inlineregister 并非毫无用处,因为它们会指示编译器在程序员编写无法进行优化的代码时抛出错误:外部 inline 定义不能引用具有内部链接的标识符(因为这些在不同的翻译单元中不可用)或定义具有静态存储持续时间的可修改局部变量(因为它们不会跨翻译单元共享状态),并且您不能使用 register 限定变量的地址。

就我个人而言,我使用惯例将 header 中的static 函数定义也标记为inline,因为将函数定义放在头文件中的主要原因是使它们可内联。

一般来说,除了 header 中的 extern 声明之外,我只使用 static inline 函数和 static const 对象定义。

我从来没有用不同于 static 的存储类编写过 inline 函数。

关于c - "static"和 "static inline"函数有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7762731/

相关文章:

c - 为什么在 C 中将指针的地址传递给函数

css - HTML,3 列布局

css - 重要标签不适用于 th 中的内联样式

带有特殊字符的 Php 脚本 url

c++ - RVO 在失败时强制编译错误

c - 如何修改configure.ac以在最终Makefile中添加库目标?

c - 当运行大文件时,二进制搜索会溢出

c - 获取要调用的正确 Lua 元方法 (C-api)

无法使用 libyahoo2 编译应用程序

css - 内联 contenteditable 标签无法在 IE 中正确对齐