使用LASlib时BOOL typedef重新定义
BOOL typedef redefinition when using LASlib
这个问题看起来可能很熟悉,但我认为它与之前就同一主题提出的问题仍然有些不同(尽管"解决方案"可能是相同的,即除了干扰第三方代码库之外,没有真正的解决方案(
如下:
一个可移植的C/C++框架构建在Linux和Windows上。它利用
-
微软C类型BOOL,它包含在winwinde.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;
此平台代码是专有的(我是作者(,因此可以进行更改。
当下游lib或应用程序希望在https://github.com/LAStools/LAStools/tree/master/LASlib编译器标记冲突的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
我不是微软用户,但这完全是倒退的(另请参阅在C中使用布尔值(。我可以想象,linux代码生成的数据片段较小,平台分支随处可见,但imho应该留给编译器。此外,我不应该操纵预处理器保护程序(这会在CMake领域造成混乱(,所以我有点纠结于此。
所以现在我面临着一个进退两难的境地;
- 更改LASlib代码(我不喜欢,它应该是第三方(
- 假设整个框架的BOOL在linux中应该是'BOOL',但这意味着将C++类型构造映射到C类型,放弃数据大小稳定性,显然明天另一个lib可以将其重新键入为PlanetCokooDevice类类型,所以它不能解决真正的问题
我已经阅读了不同类型的Typedef重定义(';signed char';vs';bool';(和包含minwindedf.h之后的bool重定义的答案,但我觉得问题更严重。
那么,在全局命名空间中,甚至在"C"级别上,是否存在某种冲突类型的包罗万象?LASlib是一个只有C++头的lib,但我也不能将整个东西外部化为"C"。
似乎没有"真正的"解决方案,即如果全局命名空间中的双类型定义都在(单独的(第三方库中定义,并且您希望将它们作为依赖项传递给下游项目,则它们将发生冲突。它们应该由各自的作者命名。
我目前的"解决方法"是通过确保我对BOOL的使用仅限于windows代码来避免这个问题,即将特定于平台的部分移动到#ifdef防护后面。在某些情况下,这意味着包装/重新键入函数返回值只是因为。丑陋,但它是有效的。
- 在类定义之后定义一个私有方法
- Android Studio:如何在build.gradle中定义自定义宏(针对不同的构建变体),并让原生C / C++
- 如何在C++中为 if 和 else 语句定义新行为
- 如何从 C++ 中的现有模板函数定义新函数
- 如何在CPropertySheet中定义新颜色
- 谁定义新操作员
- boost :: fibonacci_heap:带有比较器重新定义圆形定义错误的嵌套定义
- C 通过Typedef定义新类型
- 在 ss.clear() 之后使用 ss.str( " ") 用于新定义的字符串流
- 是标头文件中使用“新”定义的成员指针泄漏
- 使用带有Eigen库的自定义新处理程序
- 定义新的优化类型
- C# 如何定义新的指针结构
- 为模型定义新角色后程序崩溃
- C++使用类来定义新类型
- 操作员新[]定义分解
- 为什么不调用复制构造函数将临时对象复制到新定义的对象
- Qt:在按钮点击上添加自定义新选项卡
- 定义新的中缀操作符
- 错误:不能在返回类型中定义新类型