为什么收到链接错误,如果不使用内联
why receiving link error if not using inline?
以下classA.h
bool IsEqual(const float a, const float b)
{
return std::fabs(a-b) < std::numeric_limits<float>::epsilon();
}
我收到链接错误
ld: 10 duplicate symbols for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
如果我加上inline
,一切都很好。
我想知道为什么我必须添加inline
当这个函数定义在多个翻译单元中被发现时(这通常是头文件的情况,因为你通常在多个翻译单元中包含头文件,否则它们有什么意义?),你会从链接器中得到多个定义错误。
每个函数只允许一个定义。
但是标记函数inline
是一种特殊情况,它允许您在多个翻译单元中使用此定义,只要定义相同即可。语言有提供这一点,因为内联函数在定义立即可用时是最有效的(即在相同的翻译单元中,即可能在头文件中);在这个超级智能优化器的现代时代,inline
并没有真正内在地导致实际的内联,但这并没有改变语言的事实。
如果在多个源文件中包含头文件,则相同的函数符号IsEqual
将被定义多次。
传统上和在您的特殊情况下,当您使函数inline
时是可以的,因为该函数实际上没有定义,并且函数体在每个调用站点上都被替换。
或者,您可以在classA.cpp中定义函数体,并声明classA.h
#ifndef __CLASS_HEADER_
#define __CLASS_HEADER_
bool IsEqual(const float a, const float b);
#endif
IsEqual
声明为classA.h
中某个类的静态成员。因为IsEqual
有多个定义,每次包含一个。
相关文章:
- CMake 不链接 C 和 C++ 静态库(未定义对函数的引用)
- std::to_chars在MacOS/clang上编译但不链接
- SQLite 在 Windows 上的编译时不链接
- cmake不链接库文件
- Gradle cpp 插件不链接共享库
- 为什么G 不链接静态程序
- GHC 不链接依赖项
- Cmake 在构建 sfml 时不链接
- 代码中的MinGW::块不链接静态OpenSSL库
- G++ 5.5 不链接共享库
- g++不链接第三方库
- 类模板的成员函数模板找不到定义,尽管存在显式实例化。不链接
- CMAKE 查找包但不链接库
- 外部常量阵列不链接
- LNK 2005链接Visual Studio 2010中函数的错误,但不链接类的错误
- Xcode 不链接两个结构
- 我可以通过链接此 dl 从动态库中加载函数,但如果不链接此 dl,我无法在代码中使用 'dlsym' 加载它
- 如果我只在使用Boost时使用头,那会静态链接它吗,还是根本不链接
- Vs2013: static成员不链接
- AVR-GCC不链接c++与汇编函数