[英]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 土地上造成混乱)所以我有点坚持这一点。
所以现在我面临两难境地;
我已经阅读了包含 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.