命名空间
变体
操作

内联函数说明符

来自 cppreference.com
< c‎ | 语言

声明一个内联函数.

内容

[编辑] 语法

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 说明符