如何使用预处理器检测 GCC 线程模型?
Posted
技术标签:
【中文标题】如何使用预处理器检测 GCC 线程模型?【英文标题】:How to detect GCC threading model with preprocessor? 【发布时间】:2014-12-16 04:15:29 【问题描述】:我正在编写一些库代码,它们可以选择使用某个 C++11 功能(thread_local
对象)。但是,我的 found a bug 仅在 MinGW-w64 的 g++
构建中使用 POSIX 线程模型(Win32 可以正常工作)。
那么,如何使用预处理器检测当前编译器是否为具有 POSIX 线程模型的 g++
?
g++ -v
产生 ... Thread model: win32
或 ... Thread model: posix
取决于差异,但我需要一种方法来有条件地编译代码(以解决该错误),而不涉及调用 g++
的额外实例。
【问题讨论】:
【参考方案1】:检查是否定义了宏__WINPTHREADS_VERSION。如果是这样,您正在 MinGW 上使用 posix 线程。
例如:
#if defined(_WIN32) && !defined(__WINPTHREADS_VERSION)
Logic for MinGW win32 threads;
#else
Logic for MinGW posix threads or Linux/UNIX;
#endif
示例/参考:
http://savannah.gnu.org/support/?108150#comment0
https://projects.kde.org/projects/kdesupport/emerge/repository/revisions/master/entry/portage/win32libs/libssh/0002-add-a-way-to-test-ssh-connections-on-windows.patch#L114
【讨论】:
完美运行,谢谢!请注意,您需要包含<thread>
才能对其进行定义(即使 std::thread
在 Win32 线程模型中不起作用,标头仍然存在,因此允许检测便携式线程模型)。以上是关于如何使用预处理器检测 GCC 线程模型?的主要内容,如果未能解决你的问题,请参考以下文章