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

时间:2014-02-28 15:18:53

标签: c++ const 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.01745329252f; // pi / 180
    FCORE inline float ToRadian(float degree) { return degree * DEG_TO_RAD_32; }
}
}

我的FConvert命名空间中的所有常量值都会导致错误,但不会在FMath中声明。我不明白为什么?

  

FMeshTraits.obj:-1:错误:LNK2005:已定义DEG_TO_RAD_32   FMesh.obj

编辑:对不起,我没有说我已经使用过这个宏了。

#ifndef FMATH_H
#define FMATH_H

// All of the code is here

#endif

1 个答案:

答案 0 :(得分:2)

看起来你有两个.cpp文件FMeshTraits.cpp和FMesh.cpp(行话中两个独立的'翻译单元')。其中每个都被编译成一个单独的.obj文件。

下一步是将这些.obj文件链接到一个可执行文件中。但是 - 如果符号有多个冲突的定义,那么链接器将失败并显示您看到的错误消息。

避免这种情况的通常方法是只在头文件中声明(即声明类型但没有定义),并将所有定义放入.cpp文件中。这样,您在多个.obj文件中永远不会有相同的定义,因此您不会发生链接器冲突。

所以,在FMath.h中你会得到:

FCORE const float DEG_TO_RAD_32;

并且在FMath.cpp中你会:

DEG_TO_RAD_32 = 0.01745329252f;