在 C++ 中声明内联但实际上不是内联函数是否合法
is it legal to declare inline but not actually inline a function in C++
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 中使用它(,否则这是不合法的。
相关文章:
- 函数是否可以访问传递给main()的参数
- 根据某个函数是否存在启用模板
- 无论如何,我可以确定构造函数是否存在吗?
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 如何检查函数是否在LLVM Instrumentation pass的ModulePass的系统头文件中定义?
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 在对象构造期间,将指向尚未构造的子对象的指针传递给另一个子对象的构造函数是否危险?
- 某些 boost::asio 异步函数是否将处理程序连接到操作,以便处理程序被触发一次?
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 由并发无序映射查找线程调用的函数是否安全?
- 使用静态成员函数而不是普通函数是否有任何开销?
- 从其存储的回调中删除 std::函数是否安全
- 析构函数是否会自动调用 delete[] C++?
- 构造函数是否有一种现代C++方法来了解其'container'类?
- 循环中本地对象的析构函数是否保证在下一次迭代之前被调用?
- 移动构造函数是否C++过时?
- 在 c++ 中将对象设置为等于同一类的构造函数是否有效?
- 此函数是否会在C++中创建内存泄漏?
- 具有默认值的单个参数构造函数是否与默认构造函数相同?
- 如何检测构造函数是否与抛出的析构函数无关