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

