非常教程

C参考手册

C 语法

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):
    • 6.7.4 Function specifiers (p: 125-127)
  • C99 standard (ISO/IEC 9899:1999):
    • 6.7.4 Function specifiers (p: 112-113)

C 语法相关

1.#define directive
2.#elif directive
3.#else directive
4.#endif directive
5.#error directive
6.#if directive
7.#ifdef directive
8.#ifndef directive
9.#include directive
10.#line directive
11.#pragma directive
12.alignas
13.Alternative operators and tokens
14.Analyzability
15.Arithmetic operators
16.Arithmetic types
17.Array declaration
18.Array initialization
19.ASCII Chart
20.Assignment operators
21. types
22.Basic concepts
23.Bit fields
24.break statement
25.C language
26.C Operator Precedence
27.cast operator
28.character constant
29.Comments
30.Comparison operators
31.compound literals
32.Conditional inclusion
33.Conformance
34.const type qualifier
35.Constant expressions
36.continue statement
37.Declarations
38.do-while loop
39.Enumerations
40.Escape sequences
41.Expressions
42.External and tentative definitions
43.File scope
44.floating constant
45.for loop
46.Function declarations
47.Function definitions
48.Functions
49.Generic selection
50.goto statement
51.Identifier
52.if statement
53.Implicit conversions
54.Increment/decrement operators
55.Initialization
56.integer constant
57.Lifetime
58.Logical operators
59.Lookup and name spaces
60.Main function
61.Member access operators
62.Memory model
63.Objects and alignment
64.Order of evaluation
65.Other operators
66.Phases of translation
67.Pointer declaration
68.Preprocessor
69.restrict type qualifier
70.return statement
71.Scalar initialization
72.Scope
73.sizeof operator
74.Statements
75.static assert declaration
76.Static storage duration
77.Storage-class specifiers
78.string literals
79.Struct and union initialization
80.Struct declaration
81.switch statement
82.Thread storage duration
83.Type
84.Type
85.Typedef declaration
86.Undefined behavior
87.Union declaration
88.Value categories
89.Variadic arguments
90.volatile type qualifier
91.while loop
92._Alignof operator
93._Noreturn function specifier
C

C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。