我刚刚发现,当在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标头吗?
答案 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
不是一个完美的解决方案,但它应该是暂时的,直到你可以让它们在上游修复它。提升的东西很好,但它的完美并不是一成不变的。
当然,制作某种跟踪项目,这样你就不会忘记你与上游的分歧。