c++ - 命名空间“std”中没有名为“hardware_constructive_interference_size”的成员
问题描述
根据cppreference,要确定是否std::hardware_constructive_interference_size
可用,它使用以下示例:
#include <new>
#ifdef __cpp_lib_hardware_interference_size
using std::hardware_constructive_interference_size;
using std::hardware_destructive_interference_size;
#else
// 64 bytes on x86-64 │ L1_CACHE_BYTES │ L1_CACHE_SHIFT │ __cacheline_aligned │ ...
constexpr std::size_t hardware_constructive_interference_size
= 2 * sizeof(std::max_align_t);
constexpr std::size_t hardware_destructive_interference_size
= 2 * sizeof(std::max_align_t);
#endif
但是,我的系统定义__cpp_lib_hardware_interference_size
但没有符号std::hardware_constructive_interference_size
。
我该如何处理这种情况?
有没有办法检查符号是否已定义?
- Apple clang 版本 12.0.0 (clang-1200.0.32.29)
目标:x86_64-apple-darwin19.6.0
线程模型:posix
InstalledDir:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin - macOS Catalina 10.15.7 (MacBook Pro 2019)
CMakeLists.txt
cmake_minimum_required(VERSION 3.19)
project(untitled4)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
if (UNIX AND NOT APPLE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")
endif()
add_executable(untitled4 main.cpp)
解决方案
我该如何处理这种情况?
您可以使用预定义的宏来检测损坏的语言实现并对其进行例外处理。
可以通过尝试编译和运行一个小程序来进行检测:
#include <new>
int main() {
#ifdef __cpp_lib_hardware_interference_size
// return 0 if the interference_sizes are defined
return !(std::hardware_constructive_interference_size &&
std::hardware_destructive_interference_size);
#else
return 1; // no interference_sizes
#endif
}
clang++ -std=c++17 -o hwisize hwisize.cpp 2>/dev/null && ./hwisize
has_hw_interference_sizes=$?
- 如果编译失败,
has_hw_interference_sizes
将1
. - 如果编译成功,但
__cpp_lib_hardware_interference_size
未定义,has_hw_interference_sizes
则为1
. - 如果编译成功,并且
__cpp_lib_hardware_interference_size
被定义,has_hw_interference_sizes
将会是0
.
(相反的bool
逻辑是常见的shell如何定义true
(0)和false
(非0))
只需将其插入您的构建系统即可。
推荐阅读
- python - python循环依赖问题:意外错误
- javascript - 通过链接使用 Rails 和 Javascript 复制到剪贴板
- ios - Xcode 选项卡栏文本故障
- javascript - React Native - 在不使用输入的情况下显示键盘并呈现其值
- c - 使用 C11 和 GNU11 编译器标志的机器 epsilon 计算不同
- python - dir-locals.el 设置未应用于某些变量
- html - 如何从按钮中删除背景
- clojure - Clojure 的 let 是怎样一种特殊的形式?
- python - AttributeError:模块“numpy.polynomial”没有属性“多项式”
- react-native - 世博会在生产构建中找不到“主要”应用程序?