禁用使用带有MSVC语言扩展的Boost.Thread标头

时间:2009-08-04 20:32:43

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

我刚刚发现,当在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)

中隔离

我可以看到here他们已经意识到这个问题了,但由于过去两年它一直未被触及,所以希望快速修复可能是天真的。

在各种Boost配置文件中修改一些#ifdef#defines似乎应该是一个相当简单的例子,但是它们有很多,并且它们定义了使用很多宏,其目的不明确。

有人知道一个简单的黑客攻击或解决方法,以便在禁用语言扩展时允许包含Boost.Thread标头吗?

1 个答案:

答案 0 :(得分: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

不是一个完美的解决方案,但它应该是暂时的,直到你可以让它们在上游修复它。提升的东西很好,但它的完美并不是一成不变的。

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