我在stackoverflow中读到了几个关于C语言inline的问题,但仍然不清楚.

  1. static inline void f(void) {}static void f(void) {}没有实际区别.
  2. C中的inline void f(void) {}不像C++那样工作.它在C语言中是如何工作的?
  3. extern inline void f(void);到底是做什么的?

我从来没有在我的C程序中真正发现inline关键字的用法,当我在别人的代码中看到这个关键字时,它几乎总是static inline,我看不出只有static有什么不同.

推荐答案

注意:当我在这个答案中谈到.c个文件和.h个文件时,我假设您的代码布局是正确的,即.c个文件只包括.h个文件.区别在于.h文件可以包括在多个翻译单元中.

static inline void f(void) {}static void f(void) {}没有实际区别.

在ISO C中,这是正确的.它们在行为上是相同的(当然,假设您在同一个TU中没有以不同的方式声明它们!)唯一的实际效果可能是使编译器进行不同的优化.

C中的inline void f(void) {}不像C++那样工作.它在C语言中是如何工作的?extern inline void f(void);到底是做什么的?

这是由this answerthis thread来解释的.

在ISO和C++中,你可以自由使用inline void f(void) {}个头文件——尽管原因不同!

在ISO C中,它根本没有提供外部定义.在ISO C++中,它确实提供了一个外部定义;但是,C++有一个额外的规则(C没有),即如果一个inline函数有多个外部定义,那么编译器会对其进行排序并挑选其中一个.

ISO C中.c文件中的extern inline void f(void);意味着在头文件中使用inline void f(void) {}.它使函数的external definition在该转换单元中发出.如果不这样做,则没有外部定义,因此可能会出现链接错误(未指定是否有f个链接的特定调用指向外部定义).

换句话说,在ISO C中,您可以手动选择外部定义的位置;或者通过到处使用static inline来完全压制外部定义;但在ISO C++中,编译器选择外部定义的位置和位置.

在GNUC中,情况有所不同(下文将对此进行详细介绍).

为了进一步复杂化,GNU C++允许你在C++代码中写static inlineextern inline…我不想猜测它到底有什么作用

我从来没有在我的C程序中真正找到inline关键字的用法,而且当我在其他人的代码中看到这个关键字时,它几乎总是静电的inline

许多程序员不知道他们在做什么,只是把看起来可行的东西放在一起.这里的另一个因素是,您正在查看的代码可能是为GNU C编写的,而不是为ISO C编写的.

GNU C中,plain inline的行为与ISO C不同.它实际上发出一个外部可见的定义,因此,包含来自两个翻译单元的plain inline函数的.h文件会导致未定义的行为.

因此,如果编码器想要在GNU C中提供inline优化提示,那么就需要static inline.既然static inline在ISO C和GNU C中都能工作,人们最终很自然地接受了它,并看到它似乎在工作,但没有给出错误.

,在这一点上,我看不到与静态的区别.

不同之处仅在于向编译器提供超大小速度优化提示的意图.对于现代编译器,这是多余的.

C++相关问答推荐

无法删除C中文件夹内的文件

当它们都是字符时,为什么我不能使用 strcat 组合这两个字符?

`__attribute__((destructor))` 在某些情况下没有运行?

在 c 标头中使用 c++ 标头中的枚举类

最新 container_of 宏中 __mptr 的用途是什么?

C 中使用数组、推送、弹出和显示的堆栈实现

如何仅将 C 中 for 循环中的三个最大整数分配给三个单独的变量?

使用整数存储许多布尔值是否值得?

你怎么能告诉一台计算机它正在添加而不在 Assembly 中添加 addl

如何正确解决 C 中的 memset() 函数 MISRA 错误?

打印素数的程序

OpenSSL 3 Diffie-Hellman 密钥交换 C++

K&R C 编程语言书中哈希表的有效性

使用 -O3 的冒泡排序比使用 GCC 的 -O2 慢

char 数组是否保证为空终止?

numpy 怎么这么快?

是否使用 if (0) 跳过应该工作的switch 中的一个 case ?

为什么需要为每个操作系统重新编译 C/C++?

“保留用于任何用途”是什么意思?

使用模数的 C 加法