代码之家  ›  专栏  ›  技术社区  ›  Stack Overflow is garbage

在禁用msvc语言扩展的情况下使用boost.thread头

  •  2
  • Stack Overflow is garbage  · 技术社区  · 15 年前

    我刚发现,当MSVC中禁用语言扩展时,如果尝试包括 boost/thread/thread.hpp :

    致命错误C1189:错误:“线程支持不可用:已使用显式禁用 BOOST_DISABLE_THREADS

    当boost检测到语言扩展被禁用时( _MSC_EXTENSIONS 没有定义),他们定义 BOOST_DISABLE_WIN32 ,表示不安全 windows.h (如果不启用扩展,则无法编译)。

    由于 那个 定义, 增强禁用线程 定义了,即使boost.thread不是只包含头的库,并且 窗口h 仅包含在.cpp文件中。原则上,头在没有语言扩展的情况下使用应该是安全的。所有实际的win32调用都是在编译的库(.dll或.lib)中隔离的。

    我能看见 here 他们意识到了这个问题,但由于在过去的两年里,这个问题一直没有得到解决,希望能尽快得到解决可能是幼稚的。

    它看起来应该是一个相当简单的案例来修改 #ifdef S和 #defines 在各种Boost配置文件中,有很多,它们定义和使用了很多我不清楚其用途的宏。

    有人知道在禁用语言扩展时允许包含boost.thread头的简单黑客攻击或变通方法吗?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Marsh Ray    15 年前

    我看不出任何简单的方法来关闭行为。

    您可以用自己的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
    

    这不是一个完美的解决方案,但应该是暂时的,直到你能让他们在上游解决。助推器很好,但它的完美并不是一成不变的。

    当然,做一些跟踪项目,这样你就不会失去对上游偏离的跟踪。