C++ 头文件中的常量会导致多个定义错误

C++ 头文件中的常量会导致多个定义错误,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

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.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应该有“内部链接”,因此不必担心多个定义)