inline function specifier
内联函数说明符
声明一个内联函数。
句法
inline function_declaration | | (since 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
在某些翻译单元中声明,则不需要在任何地方声明它:最多一个翻译单元也可以提供常规的非内联非静态函数或声明的函数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
.
笔记
例
// file test.h
#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED
inline int sum (int a, int b)
{
return a+b;
}
#endif
// file sum.c
#include "test.h"
extern inline int sum (int a, int b // provides external definition
// file test1.c
#include <stdio.h>
#include "test.h"
extern int f(void
int main(void)
{
printf("%d\n", sum(1, 2) + f()
}
// file test2.c
#include "test.h"
int f(void)
{
return sum(2, 3
}
输出:
8
参考
- C11 standard (ISO/IEC 9899:2011):