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
相关产品推荐
相关产品推荐

