繁体   English   中英

使用 LASlib 时的 BOOL typedef 重新定义

[英]BOOL typedef redefinition when using LASlib

这个问题可能看起来很熟悉,但我认为它仍然与之前就同一主题提出的问题有些不同(尽管“解决方案”可能是相同的,即除了弄乱第 3 方代码库之外没有真正的解决方法)

开始:

一个可移植的 C/C++ 框架建立在 Linux 和 Windows 之上。 它利用

  • Microsoft C类型BOOL包含在 winwindef.h 中,是 Windows 平台 SDK 的一部分。 底层类型是“int”,如果您将值“1”定义为“ TRUE ”,将“0”定义为“ FALSE ”,这是有道理的。

     #ifdef __cplusplus extern "C" { #endif... typedef int BOOL; ... #endif
  • 使用预处理器分支,对于 linux BOOL被明智地定义为int (确切地说是 int32_t)以保持数据表示之间的字节大小一致性。 (我知道,这还不够,并且交换了结束性,但大多数代码仍然很简单。)

     typedef int32_t BOOL;

此平台代码是专有的(我作为作者),因此可以进行更改。

当下游库或应用程序想要在https://github.com/LAStools/LAStools/tree/master/LASlib包含 LASlib(LAStools 的一部分)时,编译器会标记冲突的 BOOL 类型,因为 LASlib 包含一个名为“mydefs. hpp',当在 Windows 下编译时使用 int 作为基础类型,但对于 linux 似乎更喜欢 C++ 'bool'。

  #if defined(_MSC_VER) && (_MSC_VER < 1300) || defined (__MINGW32__)
  typedef int                BOOL;
  #else
  typedef bool               BOOL;
  #endif

我不是 Microsoftie,但这完全是倒退(另请参阅Using boolean values in C )。 我可以想象 linux 代码会产生更小的数据片段,平台分支无处不在,但恕我直言,这应该留给编译器。 此外,预处理器防护不是我应该操纵的东西(并且会在 CMake 土地上造成混乱)所以我有点坚持这一点。

所以现在我面临两难境地;

  • 更改 LASlib 代码(我不喜欢,它应该是第 3 方)
  • pretend that BOOL should be ' bool ' in linux for the entire framework, but that means mapping a C++ type construct into a C type, giving up datasize stability, and obviously tomorrow another lib can retype it as a PlanetCookooDevice class type, so it doesn解决不了真正的问题。

我已经阅读了包含 minwindef.h 后使用不同类型('signed char' vs 'bool')BOOL 重新定义的 Typedef 重新定义的答案,但我觉得问题更严重。

那么,对于全局命名空间中的冲突类型,甚至在“C”级别是否存在某种包罗万象的方法? LASlib 是一个 C++ 仅标头库,但我也不能将“C”外部化。

似乎没有“真正的”解决方案,即如果全局命名空间中的双重类型定义都在(单独的)第 3 方库中定义并且您希望将它们作为下游项目的依赖项传递,则它们将发生冲突。 它们应该由各自的作者命名。

我目前的“解决方法”是通过确保我对BOOL的使用仅限于 Windows 代码来避免该问题,即将平台特定部分移动到#ifdef保护之后。 在某些情况下,这意味着包装/重新输入 function 返回值只是因为。 丑陋,但它的工作原理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM