2

我刚刚发现,在 MSVC 中禁用语言扩展时,如果您尝试包含以下内容,则会收到此错误boost/thread/thread.hpp

致命错误 C1189:#error:“线程支持不可用:它已被明确禁用BOOST_DISABLE_THREADS

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

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

我可以在这里看到他们已经意识到了这个问题,但是由于过去两年它一直没有受到影响,因此希望快速解决可能是天真的。

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

有谁知道在禁用语言扩展时允许包含 Boost.Thread 标头的简单黑客或解决方法?

4

1 回答 1

2

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

你可以用你自己的#ifdef 包装块,从 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

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

当然,做一些跟踪项目,这样你就不会忘记你与上游的分歧。

于 2009-08-04T21:13:24.070 回答