错误:xkeycheck.h(179):警告 C4005:'char16_t':宏重新定义” |致命错误 C1189

Posted

技术标签:

【中文标题】错误:xkeycheck.h(179):警告 C4005:\'char16_t\':宏重新定义” |致命错误 C1189【英文标题】:Error: xkeycheck.h(179): warning C4005: 'char16_t': macro redefinition” | Fatal error C1189错误:xkeycheck.h(179):警告 C4005:'char16_t':宏重新定义” |致命错误 C1189 【发布时间】:2018-06-04 12:29:09 【问题描述】:

我的问题类似这样:Error: "warning C4005: 'SWIGTEMPLATEDISAMBIGUATOR': macro redefinition"

我有一个类似的警告代码(在 'char16_t' 上更改):

xkeycheck.h(179): 警告 C4005: 'char16_t': 宏重新定义

然后:

xkeycheck.h(179): 注意: argomenti della riga di comando: vedere la preprente definizione di 'char16_t'

(翻译:“注:命令行参数:看前面'char16_t'的定义)

但它不断给出这个:

xkeycheck.h(250): 致命错误 C1189: #error: C++ 标准库禁止宏化 关键字。启用警告 C4005 以查找禁止的宏。

编译器:Visual Studio 2015

【问题讨论】:

【参考方案1】:

Visual Studio 2015 中添加了对 char16_tchar32_t 的支持。这意味着您不能再使用这些名称创建符号,但同样您不再需要它们,因为它们已经存在。

解决办法是去掉typedef或宏的创建,或者至少在defined(MSC_VER) && _MSC_VER < 1900时保护它。

见MSDN:

char_16_t 和 char32_t 您不能再在 typedef 中使用 char16_t 或 char32_t 作为别名,因为这些类型现在被视为内置类型。用户和库作者通常将 char16_t 和 char32_t 分别定义为 uint16_t 和 uint32_t 的别名。

要更新您的代码,请删除 typedef 声明并重命名与这些名称冲突的任何其他标识符。

【讨论】:

以上是关于错误:xkeycheck.h(179):警告 C4005:'char16_t':宏重新定义” |致命错误 C1189的主要内容,如果未能解决你的问题,请参考以下文章

03.2020 MB SD Connect C4软件问题和解决方案

03.2020 MB SD Connect C4软件问题和解决方案

03.2020 MB SD Connect C4软件问题和解决方案

具有机器学习的周期性数据(如度数 -> 179 与 -179 有 2 个不同)

require-dev.mikey179/vfsStream

UOJ #179. 线性规划