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

GCC 12.2.1中clock_cast未识别:C++20时钟转换替代方案咨询

问题描述
  • 环境:GCC 12.2.1,CMake已配置C++20标准(配置代码如下)
    set(CMAKE_CXX_STANDARD 20)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    
  • 需求:从Howard Hinnant的date库迁移到标准C++20的utc_clock特性
  • 编译错误:提示‘clock_cast’ was not declared in this scope,尝试过多种命名空间写法及from_sys方法均无效
  • 疑问:clock_cast是否未实现?有没有可行的时钟转换替代方案?

原测试代码:

using namespace std;
using namespace std::chrono;
using namespace std::literals;    

auto start = clock_cast<utc_clock>(sys_days{2015y/July/1} - 500ms);
auto end = start + 2s;
for (auto utc = start; utc < end; utc += 100ms)
{
    auto sys = clock_cast<system_clock>(utc);
    auto tai = clock_cast<tai_clock>(utc);
    auto gps = clock_cast<gps_clock>(utc);
    cout << format("%F %T SYS  ==  ", sys)
              << format("%F %T %Z  ==  ", utc)
              << format("%F %T %Z  ==  ", tai)
              << format("%F %T %Z\n", gps);
}

编译错误信息:

/home/aces/Programs/FSLockingTest/datapacket.cpp:28: error: ‘clock_cast’ was not declared in this scope; did you mean ‘clock_t’?
/home/aces/Programs/FSLockingTest/datapacket.cpp:28:20: error: ‘clock_cast’ was not declared in this scope; did you mean ‘clock_t’?
   28 |         auto sys = clock_cast<system_clock>(utc);
      |                    ^~~~~~~~~~~~~~~~~~~~~~~~
      |                    clock_t
解决方案

1. GCC对clock_cast的支持情况

GCC 12.2.1未实现C++20标准中的std::chrono::clock_cast函数,该特性直到GCC 13才被完整支持,这是编译报错的直接原因。

2. 替代方案:使用时钟类自带的转换成员函数

C++20的各个时钟类本身提供了直接的转换方法,无需依赖clock_cast,具体对应关系如下:

  • system_clock与utc_clock互转:utc_clock::from_sys()(系统时间转UTC)、utc_clock::to_sys()(UTC转系统时间)
  • utc_clock转tai_clock:tai_clock::from_utc()
  • utc_clock转gps_clock:gps_clock::from_utc()

同时注意修正std::format的语法错误,时间格式需要用{:%F %T}的占位符形式。修改后的代码示例:

#include <iostream>
#include <chrono>
#include <format>

using namespace std;
using namespace std::chrono;
using namespace std::literals;    

int main()
{
    auto start = utc_clock::from_sys(sys_days{2015y/July/1} - 500ms);
    auto end = start + 2s;
    for (auto utc = start; utc < end; utc += 100ms)
    {
        auto sys = utc_clock::to_sys(utc);
        auto tai = tai_clock::from_utc(utc);
        auto gps = gps_clock::from_utc(utc);
        cout << format("{:%F %T} SYS  ==  ", sys)
             << format("{:%F %T %Z}  ==  ", utc)
             << format("{:%F %T %Z}  ==  ", tai)
             << format("{:%F %T %Z}\n", gps);
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者jke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:41:03