:
__set_name__
impl源文件中的:
inline void func(void); // declare only, with `inline`
在其他源文件中:
void func(void) { balabala(); }
问题:声明内联函数是否合法,即使它实际上没有在头文件中内联?
PS:
为什么需要这个:我有一些宏生成的函数,可能会也可能不会在头文件中声明,所以我希望宏可以在没有明确指定内联的情况下使用
而且,我知道函数可以被包装类包装为头文件中的静态成员函数
棘手的内联解决方案是在MSVC和clang下测试的,没有编译错误,只是想知道它在C ++标准中是否合法
答案 0 :(得分:4)
这不合法。来自cppreference.com:
2)内联函数或变量的定义(因为C ++ 17)必须 存在于访问它的翻译单元(不是 必须在访问点之前)。
答案 1 :(得分:1)
它是否合法我不确定它有多大用处。内联函数必须在它们被使用的相同翻译单元中定义。也就是说,第二个文件应该给出链接器错误,因为您只在impl文件中定义它。
答案 2 :(得分:1)
[dcl.inline]
内联函数或变量应在每个使用过的翻译单元中定义,并且在每种情况下都应具有完全相同的定义([basic.def.odr])。
如果您的编译器执行LTO(或GL),您可能会使用它,否则除非您在每个TU中重新定义相同的内联函数(或者仅在一个TU中使用它),是不合法的。