如果未声明,则通过预处理器删除thread::hardware_并发 我有使用的C++代码 int nthreads = thread::hardware_concurrency();
当我尝试在某些计算机上构建应用程序时,会收到错误消息如果未声明,则通过预处理器删除thread::hardware_并发 我有使用的C++代码 int nthreads = thread::hardware_concurrency();,c++,multithreading,header,c-preprocessor,C++,Multithreading,Header,C Preprocessor,当我尝试在某些计算机上构建应用程序时,会收到错误消息 error: 'thread' has not been declared 我没有问如何解决这个错误。我更感兴趣的是,是否有一种特殊的“保护”,我可以使用它来简单地通过预处理器删除代码行,例如在OpenMP中,我可以使用: #ifdef _OPENMP ... #endif std::thread::hardware\u并发性由C++11提供。如果那些“某些计算机”上的编译器支持它,您可能必须切换C++11支持(例如,使用mingw/gc
error: 'thread' has not been declared
我没有问如何解决这个错误。我更感兴趣的是,是否有一种特殊的“保护”,我可以使用它来简单地通过预处理器删除代码行,例如在OpenMP中,我可以使用:
#ifdef _OPENMP
...
#endif
std::thread::hardware\u并发性
由C++11提供。如果那些“某些计算机”上的编译器支持它,您可能必须切换C++11支持(例如,使用mingw/gcc-std=C++11
)
要在不可用时禁用硬件\u并发
使用,最好的解决方案可能是检测C++11支持
可能适合您,即使您使用Visual Studio:
#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1900)
int nthreads = std::thread::hardware_concurrency();
#else
int nthreads = 4; // whatever fallback value
#endif
请注意,它检测到VS 2015编译器版本,因为它是第一个宣传完全支持C++11的版本。如果
硬件并发性
恰好在较旧的VS编译器上可用,您可以将\u MSC\u VER
检查调整为较旧的版本。您问的问题是否正确?听起来像是一场灾难。解决错误比在需要避免错误时尝试检测要好。“错误:'线程'尚未声明”-您是否记得使用#include
?也可能使用名称空间std代码>或更好的使用std::thread代码>因为您没有将硬件\u并发()
完全限定为std::thread::hardware\u并发()
,仅限定为thread::hardware\u并发()