C++Builder 10.4社区版std::scoped_lock缺失,疑似头文件路径问题
在C++Builder 10.4 Community Edition中使用std::scoped_lock的解决方案
问题分析
CBuilder 10.4自带的Dinkumware标准库默认路径下的<mutex>头文件未实现C17的std::scoped_lock,而子目录Dinkum\threads下的<mutex>虽有相关定义,但不在std命名空间且未被编译器优先加载,导致编译报错。
解决方案
1. 确保项目启用C++17标准
编译器默认可能未开启C++17支持,需手动配置:
- 打开项目,点击菜单栏的项目 -> 选项
- 在左侧导航栏选择C++编译器 -> 语言
- 将C++标准设置为C++17
- 保存配置后重新编译
2. 调整头文件包含路径优先级
强制让编译器优先加载包含std::scoped_lock的头文件:
- 进入项目选项的C++编译器 -> 路径和定义
- 在包含路径中添加路径:
C:\Program Files (x86)\Embarcadero\Studio\21.0\include\dinkumware64\Dinkum\threads,并将其移到包含列表的最顶部 - 注意:该路径下的
scoped_lock未在std命名空间中,若使用此路径,需修改代码为scoped_lock lock(m);而非std::scoped_lock,但更推荐优先用第一种方法确保标准库的正确性
3. 临时替代方案(若上述方法无效)
如果暂时无法调整标准库配置,可以用std::lock_guard替代(仅适用于单个互斥锁场景):
std::lock_guard<std::mutex> lock(m);
或者手动实现一个简易的scoped_lock:
template<typename... Mutexes> class scoped_lock { public: explicit scoped_lock(Mutexes&... mutexes) { std::lock(mutexes...); } ~scoped_lock() = default; scoped_lock(const scoped_lock&) = delete; scoped_lock& operator=(const scoped_lock&) = delete; };
关于编译器头文件选择逻辑
编译器会按照项目包含路径的顺序查找头文件,默认情况下根目录include\dinkumware64的优先级高于子目录,因此会先加载未实现std::scoped_lock的根目录<mutex>。调整包含路径顺序可以改变查找优先级。
内容的提问来源于stack exchange,提问作者philippe_44
相关产品推荐
相关产品推荐

