在 C++ 中声明内联但实际上不是内联函数是否合法

is it legal to declare inline but not actually inline a function in C++

本文关键字:函数 是否 C++ 声明 实际上      更新时间:2023-10-16

in 头文件:

inline void func(void); // declare only, with `inline`

在 impl 源文件中:

void func(void) { balabala(); }

在其他源文件中:

func(); // call the func

问题:声明内联函数是否合法,即使它实际上并未在头文件中内联?

附注:

为什么需要这个:我有一些宏生成的函数,可能只在标题中声明,也可能不声明,所以我希望可以在没有明确指定内联或不显式指定的情况下使用宏

而且,我知道该函数可以通过包装类包装为标头中的静态成员函数

棘手的内联解决方案在 MSVC 和 clang 下进行了测试,没有编译错误,只是想知道它C++标准中是否合法

这是

不合法的。从 cppreference.com:

2( 内联函数或变量的定义(自 C++17 起(必须 出现在访问它的翻译单元中(不是 必须在访问点之前(。

无论它是否合法,我不确定它有多大用处。内联函数必须在使用它们的相同翻译单元中定义。也就是说,第二个文件应该给出链接器错误,因为你只在 impl 文件中定义了它。

[dcl.inline]

内联函数或变量应在使用它的每个翻译单元中定义,并且在每种情况下都应具有完全相同的定义([basic.def.odr](。

如果你的编译器执行 LTO(或 GL(,你可能会侥幸逃脱,否则除非你在每个 TU 中重新定义相同的内联函数(或者只是在单个 TU 中使用它(,否则这是不合法的。