命名空间
变体
操作

inline 函数说明符

来自 cppreference.cn
< c‎ | 语言

声明一个内联函数

目录

[编辑] 语法

inline 函数声明 (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 关键字成为在头文件中定义函数的 static 的替代方案,这些头文件可能被同一程序的多个翻译单元包含。

如果一个函数在某些翻译单元中被声明为 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

[编辑] 注意

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 说明符 的内容