【问题标题】:is it legal to declare inline but not actually inline a function in C++在 C++ 中声明内联但实际上不是内联函数是否合法
【发布时间】:2017-03-21 16:08:40
【问题描述】:

在头文件中:

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

在 impl 源文件中:

void func(void) { balabala(); }

在其他源文件中:

func(); // call the func

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

PS:

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

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

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

【问题讨论】:

  • 请注意,inline 关键字与现在编译器是否会实际内联函数无关。但它还有其他含义。

标签: c++ inline


【解决方案1】:

这是不合法的。来自cppreference.com

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      [dcl.inline]

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

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

      【讨论】:

        猜你喜欢
        • 2023-01-12
        • 2020-02-15
        • 2017-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多