IMO 都使函数只具有翻译单元的范围。
“静态”和“静态内联”函数有什么区别?
为什么inline
要放在头文件中,而不是放在.c
文件中?
最佳答案
默认情况下,内联定义仅在当前翻译单元中有效。
如果存储类是extern
,则标识符有外部链接,内联定义也提供外部定义。
如果存储类是static
,则标识符有内部链接,内联定义在其他翻译单元中是不可见的。
如果未指定存储类,则内联定义仅在当前翻译单元中可见,但标识符仍具有外部链接,必须在不同的翻译单元中提供外部定义。如果在当前翻译单元中调用函数,编译器可以自由使用内联或外部定义。
因为编译器可以自由内联(和不内联)任何其定义在当前翻译单元中可见的函数(并且,由于链接时优化,即使在不同的翻译单元中,尽管 C 标准不真正考虑到这一点),对于大多数实际用途,static
和 static inline
函数定义之间没有区别。
inline
说明符(如register
存储类)只是一个编译器提示,编译器可以完全忽略它。符合标准的非优化编译器只需要考虑它们的副作用,而优化编译器将在有或没有明确提示的情况下进行这些优化。
inline
和 register
并非毫无用处,因为它们会指示编译器在程序员编写无法进行优化的代码时抛出错误:外部 inline
定义不能引用具有内部链接的标识符(因为这些在不同的翻译单元中不可用)或定义具有静态存储持续时间的可修改局部变量(因为它们不会跨翻译单元共享状态),并且您不能使用 register
限定变量的地址。
就我个人而言,我使用惯例将 header 中的static
函数定义也标记为inline
,因为将函数定义放在头文件中的主要原因是使它们可内联。
一般来说,除了 header 中的 extern
声明之外,我只使用 static inline
函数和 static const
对象定义。
我从来没有用不同于 static
的存储类编写过 inline
函数。
关于c - "static"和 "static inline"函数有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7762731/