我知道 inline
本身就是对编译器的建议,它可能会或可能不会内联函数,它还会产生可链接的目标代码。
我认为 static inline
做同样的事情(可能内联也可能不内联)但在内联时不会产生可链接的目标代码(因为没有其他模块可以链接到它)。
extern inline
在哪里适合?
假设我想用内联函数替换预处理器宏并要求内联该函数(例如,因为它使用 __FILE__
和 __LINE__
宏应该为调用者解析但不是这称为函数)。也就是说,如果函数没有内联,我想查看编译器或链接器错误。 extern inline
这样做吗? (我认为,如果没有,除了坚持使用宏之外,没有其他方法可以实现这种行为。)
C++ 和 C 之间有区别吗?
不同的编译器供应商和版本之间是否存在差异?
原文由 wilbur_m 发布,翻译遵循 CC BY-SA 4.0 许可协议
仅限 C++:
正如其他人指出的那样,在编译和链接之前评估宏(此处
__FILE__
和__LINE__
);因此,如果您有一个使用它们的函数并且您希望它们对于每个文件都不同,那么您需要与inline
相反。由于__FILE__
和__LINE__
值对于每个文件都是不同的,因此函数的定义(主体)对于每个文件都是不同的。但是(非静态)inline
表示如果函数在多个翻译单元中定义, 它们都 必须 具有相同的定义。您可以在头文件中定义(不声明)普通函数或
static
或static inline
函数并将其包含在您想要的任何位置。这样,每个翻译单元(源文件)都可以使用不同的__FILE__
和__LINE__
值获得自己的函数副本。虽然,我认为在static inline
的情况下,inline
关键字在大多数情况下是无用的。