【问题标题】:visual c++ multiple definitions of <limits> constantsvisual c++ <limits> 常量的多个定义
【发布时间】:2016-04-01 23:39:24
【问题描述】:

我有一个头文件和两个源文件。

main.cpp:

#include <iostream>
#include "constant.h"

int main() {
    std::cout << test.at("Hello") << std::endl;
}

常数.h:

#ifndef CONSTANT_H
#define CONSTANT_H

#include <string>
#include <unordered_map>

extern std::unordered_map<std::string, int> const test;

#endif

常量.cpp:

#include "constant.h"

std::unordered_map<std::string, int> const test = {
    {"Hello", 1},
    {"World", 2}
};

当我使用 Visual C++(Visual Studio 2015 Update 1) 编译时,我得到很多多定义链接器错误。

编辑:仅在启用 /Za(禁用语言扩展)开关时才会发生

所有这些似乎都源自 标头。

这是最初的几个错误(对于德语编译器输出感到抱歉):

1>constant.obj : error LNK2005: "public: static bool const std::numeric_limits<unsigned char>::is_signed" (?is_signed@?$numeric_limits@E@std@@2_NB) ist bereits in main.obj definiert.
1>constant.obj : error LNK2005: "public: static int const std::numeric_limits<unsigned char>::digits" (?digits@?$numeric_limits@E@std@@2HB) ist bereits in main.obj definiert.
1>constant.obj : error LNK2005: "public: static int const std::numeric_limits<unsigned char>::digits10" (?digits10@?$numeric_limits@E@std@@2HB) ist bereits in main.obj definiert.
1>constant.obj : error LNK2005: "public: static bool const std::numeric_limits<short>::is_signed" (?is_signed@?$numeric_limits@F@std@@2_NB) ist bereits in main.obj definiert.
1>constant.obj : error LNK2005: "public: static int const std::numeric_limits<short>::digits" (?digits@?$numeric_limits@F@std@@2HB) ist bereits in main.obj definiert.
1>constant.obj : error LNK2005: "public: static int const std::numeric_limits<short>::digits10" (?digits10@?$numeric_limits@F@std@@2HB) ist bereits in main.obj definiert.

但是,当我在 Linux 上使用 Clang/C2 或 g++ 或 clang++ 编译相同的代码时,我没有收到任何链接器错误。

这个程序是否违反了 ODR,Visual C++ 拒绝它是否正确?

【问题讨论】:

  • 也许你可以添加错误信息的例子?
  • 无法用 VS 2015 pro 重现。乌龟动了。
  • 也无法使用 Qt 5.5 / MinGW 4.9.2 / CMake 重现。
  • 这听起来更像是一个链接器问题而不是编译器问题,而且更加奇怪,因为人们会期望这些事情无论如何都是inline
  • 能够在 VS 社区中使用 /Za 进行复制。我也得到1&gt;c:\dev\test\constant.cpp(3): warning C4592: 'test': symbol will be dynamically initialized (implementation limitation)

标签: c++ visual-c++ multiple-definition-error one-definition-rule


【解决方案1】:

这听起来像是一个完全损坏的工具链,尤其是因为您自己甚至没有直接包含&lt;limits&gt;。显然,Visual Studio 2015 的“非扩展”模式并没有像“向 C++ 中添加很多东西”模式那样得到那么多的测试。

FWIW,你的代码没问题。

在 MS Connect 上提出一个错误。

幸运的是,您已经有了解决方法。

【讨论】:

    猜你喜欢
    • 2021-09-27
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多