Visual C++ <limits> 常量的多个定义



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

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

constant.cpp:

#include "constant.h"
std::unordered_map<std::string, int> const test = {
    {"Hello", 1},
    {"World", 2}
};

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

EDIT:只有当启用/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++拒绝它是否正确?

这听起来像是一个完全断裂的工具链,尤其是因为您自己甚至没有直接包含<limits>。显然,Visual Studio 2015的"非扩展"模式并没有像"向C++添加很多东西"模式那样得到太多测试。

FWIW,你的代码很好。

在MS Connect上引发错误。

幸运的是,您已经有了一个变通方法。

相关内容

  • 没有找到相关文章

最新更新