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

使用GCC时std::chrono时长字面量""s运算符报错问题

解决std::chrono字面量编译错误的问题

你遇到的问题其实和-fext-numeric-literals选项关系不大,这个选项是用来启用GNU扩展的数值字面量后缀,而标准C++里的std::chrono字面量有自己的使用要求,我来一步步帮你梳理:

问题根源

  • 缺少必要的头文件:std::chrono的所有相关定义(包括字面量运算符)都在<chrono>头文件里,如果你没包含它,编译器根本找不到operator""s的定义。
  • 未引入字面量的命名空间:标准库把chrono的字面量运算符放在了std::chrono_literals这个子命名空间里,默认不会自动导入,所以直接写10s编译器识别不了。
  • -fext-numeric-literals是多余的:这个选项针对的是GNU扩展的自定义数值后缀,和标准C++的chrono字面量完全不相关,加了也解决不了你的问题,反而可能带来不必要的扩展依赖。

修正后的代码示例

#include <chrono>
// 引入chrono字面量的命名空间,这样就能直接用10s、20ms这类写法
using namespace std::chrono_literals;

int main() {
    std::chrono::duration<uint64_t, std::milli> millisecs = 10s;
    millisecs = 20s; // 现在编译没问题了
    return 0;
}

如果你不想全局引入命名空间,也可以用限定名来使用字面量:

#include <chrono>

int main() {
    std::chrono::duration<uint64_t, std::milli> millisecs = std::chrono::operator""s(10);
    millisecs = std::chrono::operator""s(20);
    return 0;
}

调整后的编译命令

去掉多余的-fext-numeric-literals,用标准的C++17编译即可:

g++ --std=c++17 -Wall -pedantic -Wextra main.cpp -O0 -g -o go

这样就能顺利编译通过啦,核心就是要包含头文件并引入对应的字面量命名空间~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:59:08