处理代码重新定义int类型(uint16_t,int16_t等)和Boost不喜欢它

use*_*792 1 c++ boost boost-asio c++11

所以我在这里有一点立场,我不确定如何继续进行,或者它是否可以修复......

我们使用其他团队提供的第三方SDK,此SDK必须用于我们的应用才能正常运行.

在这个SDK中,有这样的行

#define uint16_t UINT16
#define uint8_t UINT8
Run Code Online (Sandbox Code Playgroud)

问题出在Boost中,更具体地说,ASIO/Details/cstdint.hpp文件中有行

using std::uint16_t
using std::uint8_t
Run Code Online (Sandbox Code Playgroud)

我的应用程序现在不会编译,因为它真的在做

using std::UINT16
using std::UINT8
Run Code Online (Sandbox Code Playgroud)

并且它抱怨这些类型显然不存在于std命名空间中.

这些UINT16和UINT8定义在应用程序中的任何地方都非常大,因此替换它们并不是很可行,我甚至不确定如果我这样做,SDK是否会起作用.

在包含boost头文件之前,我可以尝试#undef所有这些定义吗?然后重新定义它们?看起来很傻,我怀疑它甚至会起作用.

有什么建议?

seh*_*ehe 9

问题出在Boost中,更具体地说,ASIO/Details/cstdint.hpp文件中有行

这是颠倒的.问题显然在标题中重新定义了完美的常见类型名称.

最可行的解决方案是在包含任何boost标头之前不要包含SDK标头.

拼凑的解决方法是取消定义宏.(如果你问我,那条道路就是疯狂):

#ifdef uint16_t
     #undef uint16_t
#endif
Run Code Online (Sandbox Code Playgroud)

  • @Eljay我首选的攻击计划是用我自己的包装界面完全替换标题,从而在单独的翻译单元中包含"杂乱的代码"."杂乱的图书馆"正在做其他不好的事情,所以我会对任何[未定义的行为](https://en.wikipedia.org/wiki/Undefined_behavior)密切关注,例如重新定义导致ODR违规的事情 (3认同)