【问题标题】:BOOL redefinition after including minwindef.h包含 minwindef.h 后的 BOOL 重新定义
【发布时间】:2019-01-09 14:32:57
【问题描述】:

我是 C/C++ 的新手,以防万一:) 我克隆了一个用 C 语言编写的旧协议栈解决方案,其中一个 C++ 主类将其导入 VS (Visual C++ 2017 v 15.9.5 面向 Windows SDK 10.0.17134.0)它编译正确并且工作正常。

现在制作了一个 C++ 解决方案(Windows 控制台应用程序)创建了一个文件夹 lib,将所有 .h.c 文件复制粘贴到 lib 中,添加了 additional include directories 的路径以及链接器 additional library directories

构建解决方案会引发大量错误。我现在要解决的问题是:

其中一个头文件包含类型定义

typedef uint8_t U8;
#ifndef BOOL
typedef U8 BOOL;
#endif

但这与 Windows 套件中的 minwindef.h 冲突。虽然我#include types.h 得到C2371 'BOOL': redefinition; different basic types 在整个解决方案中,我想使用 BOOL 的这个定义以及这个标题中定义的所有其他定义。

我应该如何解决这个问题?或者一般来说,如果在 C++ 项目中使用 C 代码,我应该遵循哪些设置和宏(例如方法中的外部“C”)

【问题讨论】:

  • 我会删除 typedef U8 BOOL 定义。 #ifndef 宏不能防止 typedef。
  • 作为同时 C 和 C++ 的新手,您现在应该牢记一个重要的教训:C 和 C++ 是不同的语言。没有“C/C++”。不能假定用任何一种语言编写的随机代码在另一种语言中具有相同的语义,甚至可能无法在另一种语言中编译。用两种语言编写具有相同语义的代码很棘手。
  • @Jean-FrançoisFabre 我不认为这是有意的。在宏尚未完成该工作的情况下,它会添加一个新的类型别名。不幸的是,在这种情况下,一些其他类型的别名也已经完成了这项工作。
  • 这似乎更多是关于旧库和 Windows 头文件之间的兼容性,而不是特别是关于 C 或 C++。
  • 你说你已经“克隆了一个 older 协议栈解决方案”(强调我的)。是否可以获得具有固定 Windows 兼容性的该库的 更新 版本?或者也许可以找到其他适用于 Windows 的库?

标签: c++ c visual-c++


【解决方案1】:

我对您尝试使用的库一无所知,因为您没有告诉我们它是什么。但我可以做出一些猜测:

  1. 该代码根本不用于与 Windows 代码交互;
  2. 通过创建 Windows C++ 应用程序,您添加了 Windows 依赖项;
  3. Windows 依赖项(以使用像BOOL 这样的短名称毒害命名空间而闻名)与库的代码(在定义时与它的BOOL 宏和它的BOOL 做同样的事情)发生冲突输入别名,否则)。

这实际上与 C 与 C++ 或类似的东西无关,并且您无法进行一般修复。您可以尝试摆脱 Windows 依赖项(您的任务是否需要该标头?)或者您可以修补您的库以不触及 BOOL(在确保 Windows 的 BOOL 是您需要的之后)。

并以此作为一个很好的教训,不要污染命名空间!

【讨论】:

  • 非常感谢您的回答,我在另一个答案中看到了您的评论,作者删除了它:(
  • 那个项目是一个旧的协议栈,实现了标准(即 J1939 标准)的不同层,不,我想使用那个栈并为更现代的工具创建插件。
猜你喜欢
  • 1970-01-01
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-06
  • 2015-11-29
  • 1970-01-01
相关资源
最近更新 更多