内联函数说明符
声明一个内联函数.
内容 |
[编辑] 语法
inline function_declaration | (自 C99) | ||||||||
[编辑] 解释
inline
说明符的目的是作为对编译器执行优化的提示,例如函数内联,这通常需要在调用点可见函数的定义。编译器可以(并且通常会)忽略 inline
说明符的存在或不存在以进行优化。
如果编译器执行函数内联,它将用函数体替换对该函数的调用,从而避免函数调用的开销(将数据放到堆栈上并检索结果),这可能会导致更大的可执行文件,因为函数的代码必须重复多次。结果类似于类似函数的宏,除了函数中使用的标识符和宏引用在定义点可见的定义,而不是在调用点可见的定义。
无论内联是否发生,都保证内联函数的以下语义
任何具有内部链接的函数都可以声明为 static inline
,没有其他限制。
非静态内联函数不能定义非 const 函数局部静态,也不能引用文件范围静态。
static int x; inline void f(void) { static int n = 1; // error: non-const static in a non-static inline function int k = x; // error: non-static inline function accesses a static variable }
如果一个非静态函数被声明为 inline
,那么它必须在同一个翻译单元中定义。没有使用 extern
的内联定义在外部不可见,也不阻止其他翻译单元定义相同的函数。这使得 inline
关键字成为在头文件中定义函数的替代方法,头文件可能包含在同一个程序的多个翻译单元中。
如果一个函数在某些翻译单元中被声明为 inline
,它不需要在所有地方都声明为 inline
:最多一个翻译单元也可以提供一个常规的、非内联的非静态函数,或者一个声明为 extern inline
的函数。这个翻译单元被称为提供外部定义。为了避免未定义的行为,如果使用具有外部链接的函数名称在表达式中,程序中必须存在一个外部定义,参见一个定义规则.
具有外部链接的内联函数的地址始终是外部定义的地址,但当使用此地址进行函数调用时,内联定义(如果存在于翻译单元中)或外部定义被调用是未指定的。在内联定义中定义的静态对象与在外部定义中定义的静态对象不同
inline const char *saddr(void) // the inline definition for use in this file { static const char name[] = "saddr"; return name; } int compare_name(void) { return saddr() == saddr(); // unspecified behavior, one call could be external } extern const char *saddr(void); // an external definition is generated, too
C 程序不应该依赖于调用内联版本还是外部版本的函数,否则行为是未指定的。
[编辑] 关键字
[编辑] 注意
inline
关键字是从 C++ 借鉴的,但在 C++ 中,如果一个函数被声明为 inline
,它必须在每个翻译单元中声明为 inline
,并且每个内联函数的定义也必须完全相同(在 C 中,定义可以不同,并且根据差异,只会导致未定义的行为)。另一方面,C++ 允许非 const 函数局部静态,并且来自内联函数的不同定义的所有函数局部静态在 C++ 中是相同的,但在 C 中是不同的。
[编辑] 示例
头文件 "test.h" #ifndef TEST_H_INCLUDED #define TEST_H_INCLUDED inline int sum(int a, int b) { return a + b; } #endif 源文件 "sum.c" #include "test.h" extern inline int sum(int a, int b); // provides external definition 源文件 "test1.c" #include <stdio.h> #include "test.h" extern int f(void); int main(void) { printf("%d\n", sum(1, 2) + f()); } 源文件 "test2.c" #include "test.h" int f(void) { return sum(3, 4); } 输出 10 |
[编辑] 参考文献
- C23 标准 (ISO/IEC 9899:2024)
- 6.7.4 函数说明符 (p: TBD)
- C17 标准 (ISO/IEC 9899:2018)
- 6.7.4 函数说明符 (p: TBD)
- C11 标准 (ISO/IEC 9899:2011)
- 6.7.4 函数说明符 (p: 125-127)
- C99 标准 (ISO/IEC 9899:1999)
- 6.7.4 函数说明符 (p: 112-113)
[编辑] 参见
C++ 文档 对于
inline 说明符 |