C++ 头文件中的常量会导致多个定义错误
FCORE宏用于共享库导出 这是我的头文件FMath.hC++ 头文件中的常量会导致多个定义错误,c++,constants,header-files,C++,Constants,Header Files,FCORE宏用于共享库导出 这是我的头文件FMath.h namespace FMath { // ... FCORE const float PI_32 = 3.14159265359f; // pi FCORE inline float Floor(float value) { return floorf(value); } namespace FConvert { // ... FCORE const float DEG_TO_RAD_32 = 0
namespace FMath {
// ...
FCORE const float PI_32 = 3.14159265359f; // pi
FCORE inline float Floor(float value) { return floorf(value); }
namespace FConvert {
// ...
FCORE const float DEG_TO_RAD_32 = 0.01745329252f; // pi / 180
FCORE inline float ToRadian(float degree) { return degree * DEG_TO_RAD_32; }
}
}
我的FConvert命名空间中的所有常量值都会导致错误,但不会在FMath中声明。我不明白为什么
FMeshTraits.obj:-1:错误:LNK2005:中已定义DEG_至RAD_32
FMesh.obj
编辑:很抱歉,我没有说我已经使用了这个宏
#ifndef FMATH_H
#define FMATH_H
// All of the code is here
#endif
看起来您有两个.cpp文件FMeshTraits.cpp和FMesh.cpp(术语中两个独立的“翻译单元”)。每个文件都被编译成一个单独的.obj文件 下一步是将这些.obj文件链接到一个可执行文件中。但是-如果一个符号有多个相互冲突的定义,那么链接器将失败,并显示错误消息 避免这种情况的通常方法是只在头文件中声明(即声明类型但不声明定义),并将所有定义放入.cpp文件中。这样,在多个.obj文件中就不会有相同的定义,因此不会出现链接器冲突 因此,在FMath.h中,您将:
FCORE const float DEG_TO_RAD_32;
DEG_TO_RAD_32 = 0.01745329252f;
在FMath.cpp中,您可以:
FCORE const float DEG_TO_RAD_32;
DEG_TO_RAD_32 = 0.01745329252f;
您在多个TU中定义同一变量,因此多个对象都有它。您可以尝试使用静态或匿名名称空间使它们在每个TU中都是唯一的,或者仅在一个TU中定义它们。请您进一步解释一下,FCORE是什么?你能给我看看吗?它包含关键字extern吗?很抱歉我没有看到这个。FCORE是Qt(Q_shared_EXPORT,Q_shared_IMPORT)的一个共享lib指令,现在它说“如果不是extern,则必须初始化const对象”。这里接受的答案描述了这种情况:基本上-如果FCORE包含“extern”,那么我编写它的方式应该有效(在头中声明,在一个.cpp文件中定义)。如果它不包含extern,那么您的原始代码应该可以工作(const/inline应该有“内部链接”,因此不必担心多个定义)