c++ - 如何在 C++ 中定义内联自由函数(非成员函数)?
问题描述
在 C++ 中,我需要定义一些内联通用函数。但是,当我在头文件中编写原型并在 a.cpp 文件中编写实现时,遇到“LNK2001 未解析的外部符号”错误。
我应该删除.cpp文件并在头文件中实现该功能吗?
我正在尝试定义一些其他类可以使用的共享非成员数学函数。
头文件:
inline void foo()
{
//some code
}
.cpp 文件
//nothing
解决方案
说明符的名称inline
有些误导,因为它暗示函数是内联的。但是,inline
最重要的是指定函数的链接(这也是编译器考虑内联的提示)。对于声明的函数inline
,编译对象中不会生成可链接符号。
因此,函数只有在头文件中定义(而不仅仅是声明)inline
时才有意义,该头文件可能包含在许多编译单元中。说明符 than 防止编译器在相应的目标文件中发出此函数的多个(实际上是任何)符号。inline
如果一个编译单元只需要一个小函数,则不需要在其他任何地方声明它。此外,您不需要将其声明为内联,而是将其放置在匿名命名空间中以防止其可见(在生成的目标文件中)。
所以,要么(这很可能是你的用例)
// foo.hpp:
inline void foo(bar x) { /* ... */ } // full definition
// application.cpp:
#include "header.hpp"
/* ... */ foo();
或者
// application.cpp:
namespace {
inline void foo(bar x) // inline specifier redundant
{ /* ... */ }
}
/* ... */ foo();
推荐阅读
- angular - 将响应对象的值分配给模型对象
- javascript - 当我们使用“redux-starter-kit”时,如何访问另一个减速器中的减速器状态?
- saml-2.0 - Shibboleth 3 Idp 使用 ws-fed
- android - 无法通过我的 Android 应用程序中的蓝牙热敏打印机打印阿拉伯字符串
- python - 如何处理熊猫中的复制粘贴表-重塑列向量
- spring - 从 JPA 存储库的另一个表中选择数据
- python - 显示 end= '' 和 while 循环的问题。完成后希望它转到新行
- php - Laravel 5.8 - 播种多对一关系
- python - Discord.py 重写
- java - 文件移动到另一台计算机时出现“实例化 servlet 类”错误