You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 23:20:26