c++ - 在禁用 MSVC 语言扩展的情况下使用 Boost.Thread header

标签 c++ visual-c++ boost boost-thread

我刚刚发现,当在 MSVC 中禁用语言扩展时,如果您尝试包含 boost/thread/thread.hpp,则会出现此错误:

fatal error C1189: #error : "Threading support unavaliable: it has been explicitly disabled with BOOST_DISABLE_THREADS"

似乎当 Boost 检测到语言扩展被禁用时(_MSC_EXTENSIONS 未定义),它们定义了 BOOST_DISABLE_WIN32,以表明包含 windows.h(如果没有启用扩展将无法编译)。

作为 that #define 的结果,BOOST_DISABLE_THREADS 被定义了,即使 Boost.Thread 不是一个只有头文件的库,而且 windows。 h 仅包含在 .cpp 文件中。原则上,标题应该在没有语言扩展的情况下安全使用。所有实际的 win32 调用都隔离在编译库(.dll 或 .lib)中

我可以看到 here他们知道这个问题,但由于在过去两年中一直没有受到影响,因此希望快速解决问题可能是天真的。

修改各种 Boost 配置文件中的一些 #ifdef#defines 似乎应该是一个相当简单的案例,但是有一个他们中的很多人,他们定义和使用了很多我不清楚其目的的宏。

有没有人知道在禁用语言扩展时允许包含 Boost.Thread header 的简单 hack 或变通方法?

最佳答案

我没有看到任何关闭该行为的简单方法。

你可以用你自己的 #ifdef 包装这个 block ,从 boost\config\suffix.hpp(214) 开始:

#ifndef TEMP_HACK_DONT_DISABLE_WIN32_THREADS // XXX TODO FIXME

#if defined(BOOST_DISABLE_WIN32) && defined(_WIN32) \
   && !defined(BOOST_DISABLE_THREADS) && !defined(BOOST_HAS_PTHREADS)
#  define BOOST_DISABLE_THREADS
#endif

#endif // ndef TEMP_HACK_DONT_DISABLE_WIN32_THREADS

这不是一个完美的修复,但它应该是暂时的,直到您可以让他们在上游修复它。 boost 的东西很好,但它的完美并不是一成不变的。

当然,制作某种跟踪项目,这样您就不会忘记与上游的分歧。

关于c++ - 在禁用 MSVC 语言扩展的情况下使用 Boost.Thread header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1229786/

相关文章:

c++ - 使用命令行提示的 Vigenere 密码

c++ - 如何使用#define 定义 NULL

C++__FILE__宏的类型是什么

c++ - char (*(*a[4])())[5] 是什么意思?

c++ - exp10 不同于 pow(10)

visual-c++ - 与VC++编译器标志等效的g++编译器标志

c++ - 如何在 Qt Creator 中更改/配置所需的编译器?即在 MSVC/Mingw 或 g++/clang++ 之间切换

c++ - boost::序列化可变成员

c++ - 使用自定义删除器 boost scoped_ptr/scoped_array

c++ - 执行时使用boost::asio::deadline_timer时出错