繁体   English   中英

检测操作系统是否可用(例如 std::mutex)

[英]Detect if OS is available (e.g. std::mutex)

如果目标平台支持std::mutex,有没有办法通过宏检测?

我想为我们的一个开源项目做出贡献,因为他们正在使用 std::mutex。 我们正在使用 gcc-arm-none-eabi,其中 std::mutex 不可用(但 RTOS 特定互斥锁)。

如果我可以通过预处理器宏检测是否没有可用的操作系统,我将启用(ifdef)代码以提供自定义互斥锁。

我可以测试 gcc-arm-none-eabi 但由于那里还有其他“裸机”编译器,我宁愿测试功能的缺失而不是编译器/目标平台的存在。

标准确实指定了一些可能提供帮助的预定义宏。

首先,在 C++11 中引入了<mutex> ,因此我们可以使用预定义的宏__cplusplus来检测我们的实现是否声称是 C++11 或更高版本。

#if __cplusplus >= 201103L

其次,C++11 标准规定托管实现是一种程序可以有多个线程同时执行的实现(与独立实现不同,其中有多个线程同时执行的能力由实现定义)。 方便的是,它还引入了一个预定义的宏__STDC_HOSTED__来测试托管实现,以及一个可选定义的宏__STDCPP_THREADS__来测试一个程序是否可以有多个执行线程。 如果为真,则两者都扩展为1

#if __STDC_HOSTED__ == 1 && __STDCPP_THREADS__ == 1

在大多数情况下,可以合理地假设一个不能有多个执行线程的系统不支持它们之间的同步方式。

将所有这些放在一起,我们得到(使用未定义的宏不会测试为等于1的事实)

#if __cplusplus >= 201103L && __STDC_HOSTED__ == 1 && __STDCPP_THREADS__ == 1

#include <mutex>

//   code that uses <mutex> here


#else

// start testing for other OS and mutex/thread mechanisms here
#endif

我没有测试上述内容,但这是我在开始深入研究特定于特定主机系统或编译器的测试宏之前将使用的第一个选项。

您可以创建一个使用std::mutex的小型 c++ 源文件。 如果编译失败,您可能会认为您没有std::mutex

如何在项目构建期间执行此操作并设置预处理器宏取决于您的构建系统。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM