命名空间
变体
操作

函数说明符

来自 cppreference.com
< c‎ | 语言

用于函数的声明。

  • inline (自 C99) - 建议编译器“内联”函数,使对它的调用尽可能快。
  • _Noreturn (自 C11) - 指定函数不会返回到调用它的位置。

内容

[编辑] 语法

inline 函数声明
_Noreturn 函数声明

[编辑] 解释

[编辑] inline (自 C99)

inline 关键字是给编译器提供的一种优化提示。编译器可以自由地忽略此请求。

如果编译器内联函数,它会用实际的函数体替换对该函数的每次调用(不生成调用)。这避免了函数调用产生的额外开销(将数据放入堆栈并检索结果),但它可能导致可执行文件更大,因为函数的代码必须重复多次。结果类似于 函数式宏.

函数体必须在当前翻译单元中可见,这使得 inline 关键字对于实现头文件中的函数是必要的,即,没有需要编译和链接的源文件。

[编辑] inline 示例

在关闭内联的情况下,运行时间约为 1.70 秒。在开启内联的情况下,运行时间不到一秒。

/*
inline int sum(int a, int b) {
  return (a + b);
}
 
int c = sum(1, 4);
// If the compiler inlines the function the compiled code will be the same as writing:
int c = 1 + 4;
*/
 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
/* int sum (int a, int b) __attribute__ ((noinline)); */
 
static inline
int sum (int a, int b)
{
  return a+b;
}
 
int main(void)
{
    const int SIZE = 100000;
    int X[SIZE],Y[SIZE],A[SIZE];
    int i,j;
    for (i=0;i<SIZE;++i) {
        X[i] = rand();
        Y[i] = rand();
    }
 
    clock_t t = clock();   /* start clock */
    for (i=0;i<5000;++i) {
        for (j=0;j<SIZE;++j)
            A[j] = sum(X[j],Y[j]);
    }
    t = clock()-t;         /* stop clock  */
 
    printf("Time used: %f seconds\n", ((float)t)/CLOCKS_PER_SEC);
    printf("%d\n", A[0]);
    return EXIT_SUCCESS;
}

可能的输出

Time used: 0.750000 seconds
-1643747027

[编辑] _Noreturn (自 C11)

_Noreturn 关键字表明它后面的函数不会返回到调用它的函数。如果用 _Noreturn 声明的函数试图返回值,编译器通常会生成警告。

在下面的示例中,调用了 stop_now() 函数,这会导致程序立即终止(除非捕获了 SIGABRT 信号)。包含 printf()return EXIT_SUCCESS; 的代码在调用 stop_now() 之后永远不会执行,执行也不会返回到 main() 函数,该函数是调用 stop_now() 的位置。

[编辑] _Noreturn 示例

#include <stdlib.h>
#include <stdio.h>
 
_Noreturn void stop_now() {
  abort();
}
 
int main(void)
{
  printf("Preparing to stop...\n");
 
  stop_now();
 
  printf("This code is never executed.\n");
 
  return EXIT_SUCCESS;
 
}

输出

Preparing to stop...
Abort

[编辑] 关键字

inline, _Noreturn

[编辑] 另请参阅

存储类说明符, abort()