声明内联是否合法,但实际上并没有在C ++中内联函数

时间:2017-03-21 16:08:40

标签: c++ inline

头文件中的

__set_name__
impl源文件中的

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

在其他源文件中:

void func(void) { balabala(); }

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

  

PS:

     

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

     

而且,我知道函数可以被包装类包装为头文件中的静态成员函数

     

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

3 个答案:

答案 0 :(得分:4)

这不合法。来自cppreference.com

  

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

[dcl.inline]

  

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

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

相关问题