命名空间
变体
操作

函数说明符

来自 cppreference.cn
< c‎ | 语言

用于函数声明中。

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

目录

[编辑] 语法

inline function_declaration
_Noreturn function_declaration

[编辑] 解释

[编辑] 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 信号)。调用 stop_now() 之后的 printf()return EXIT_SUCCESS; 的代码永远不会执行,并且执行永远不会返回到调用 stop_now()main() 函数。

[编辑] _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()