加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

visual c常量的多个定义

发布时间:2020-12-16 06:51:38 所属栏目:百科 来源:网络整理
导读:我有一个标题和两个源文件. 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_mapextern std::unordered_ma
我有一个标题和两个源文件.

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(禁用语言扩展)开关时发生

所有这些似乎都源于< limits>头.

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

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.

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

这个程序是否违反ODR并且拒绝它是否是Visual C正确的?

解决方法

这听起来像是一个完全破坏的工具链,特别是因为你甚至没有直接包括< limits>你自己.显然,Visual Studio 2015的“非扩展”模式没有像“向C添加大量内容”模式那样进行测试.

FWIW,您的代码很好.

提出MS Connect上的错误.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读