visual c ++ <limits>常量的多个定义

时间:2016-04-01 23:39:24

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

我有一个标题和两个源文件。

main.cpp中:

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

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

constant.h:

#ifndef CONSTANT_H
#define CONSTANT_H

#include <string>
#include <unordered_map>

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

#endif

constant.cpp:

#include "constant.h"

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

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

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

所有这些似乎都源于&lt; limits&gt;报头中。

以下是前几个错误(抱歉德国编译器输出):

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并且拒绝它是否正确?

1 个答案:

答案 0 :(得分:0)

这听起来像是一个完全破坏的工具链,特别是因为你自己甚至没有直接包含<limits>。显然&#34;非延伸&#34; Visual Studio 2015的模式并没有像C ++那样为C ++添加很多东西。模式。

FWIW,您的代码很好。

提出MS Connect上的错误。

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