使用内联函数 c++ 的未定义引用
Undefined reference with inline function c++
我有两个 cpp 文件:
F1.cpp
using namespace std;
int i;
void Modify();
int main()
{
i=1;
cout << "i main 1 = " << i << endl;
Modify();
cout << "i main 2 = " << i << endl;
return 0;
}
F2.cpp
using namespace std;
extern int i;
inline void Modify()
{
i=99;
cout << "i modify = " << i << endl;
}
当我启动可执行文件时,出现此错误:F1.o:在函数主中:F1.cpp:(.text+0x4a(:未定义对"修改(("的引用 collect2:错误:ld 返回 1 个退出状态
我不明白为什么会发生这种情况,因为内联函数的要点是在调用函数时复制粘贴代码。所以当我在我的主方法中调用 Modify(( 时,我会认为它会将 Modify(( 函数的代码粘贴在那里,因此我不明白为什么会有未定义的引用......
请帮忙!
内联函数的定义应存在于使用它的每个编译单元中。
来自 C++ 17 标准(10.1.6 内联说明符(
2带有内联的函数声明(11.3.5、12.2.1、14.3( 说明符声明内联函数。内联说明符指示 到函数体的内联替换的实现 调用点优先于通常的函数调用 机制。执行此内联操作不需要实现 在呼叫点进行替换;但是,即使这种内联 省略替换,内联函数的其他规则 本节中规定的仍应得到尊重。
和
6 每次翻译中都应定义内联函数或变量 使用ODR的单位,应具有完全相同的单位 每种情况下的定义
void Modify();
这一行实际上是一个函数声明。但是,您尚未提供函数的实现(即函数定义(。您已在 F2 中定义了一个内联函数.cpp但这在 F1.cpp 中不可见。
通常的做法是在头文件中定义内联函数。它们通常是非常短的函数,大小为一两行。发生的情况是,在编译期间,编译器会将内联函数的内容复制到使用它的任何位置。但是,以内联方式声明函数并不能保证会发生这种情况。编译器可以自由选择扩展部分、全部或不扩展内联函数。
您可能会发现C++常见问题解答的这一部分很有趣:
注意:函数的定义(介于 的 {...}(放置在头文件中,除非使用该函数 仅在单个.cpp文件中。特别是,如果您将内联 函数的定义到一个.cpp文件中,你从其他一些文件中调用它 .cpp文件中,你将从链接器收到"未解析的外部"错误。
在您的 F1.cpp 文件中,从未实际定义过Modify()
。这也是返回的错误所指的。
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- 使用mysql c++连接器的未定义引用
- 对 Scalar ::Scalar() 的未定义引用
- 对复制 CTOR 和 CTOR 的未定义引用
- 对显式实例化的模板函数的未定义引用
- TensorRT (C++ API) 对"createNvOnnxParser_INTERNAL"的未定义引用
- 2个模板化类的非模板友元函数未定义引用错误
- 编译 libfluid 样本控制器时对"event_base_del_virtual"的未定义引用
- 获取对function_name的未定义引用
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- 对结构方法的未定义引用
- 使用内联函数 c++ 的未定义引用
- 对 CMake 中'cudaRegisterLinkedBinary'链接错误的未定义引用?
- 对 DLOPEN 的未定义引用
- QT C++中对全局变量的未定义引用
- 快速数学导致对"__pow_finite"的未定义引用
- 对 boost::system::d etail::system_category_instance 的未定义引用,从
- OpenCV 3.4.3 中对 'cv::String::d eallocate()' 错误的未定义引用