为何std::chrono::time_zone在不同OS的C++20环境中支持有差异?
C++20标准特性在不同编译器中支持不一致的原因
问题背景
在Windows系统中,使用设置为C++20代码生成的Visual Studio可成功编译以下代码:
c++20.cpp:
#include <chrono> int main() { const std::chrono::time_zone *timeZone = std::chrono::current_zone(); return 0; }
但在树莓派4上使用g编译时出现错误,g版本信息:
pi@rasp:~ $ g++ --version g++ (Raspbian 10.2.1-6+rpi1) 10.2.1 20210110 Copyright (C) 2020 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
编译命令及错误:
pi@rasp:~ $ g++ -std=c++20 c++20.cpp c++20.cpp: In function ‘int main()’: c++20.cpp:5:21: error: ‘time_zone’ in namespace ‘std::chrono’ does not name a type; did you mean ‘time_point’? 5 | const std::chrono::time_zone *timeZone = std::chrono::current_zone(); | ^~~~~~~~~ | time_point
疑问:C++版本不是标准化的吗?为何不同操作系统的环境中会缺失部分函数?
解答
C++标准是统一的,但编译器实现有先后
C标准只定义了语言和库的功能规范,具体的实现工作由MSVC、GCC、Clang等编译器厂商完成。新的C标准发布后,厂商需要逐步适配所有特性,不可能在标准发布时就100%支持全部内容。你的GCC版本太老,未实现时区相关特性
你使用的GCC 10.2是2021年的版本,对C20的支持并不完整。std::chrono::time_zone和std::chrono::current_zone()这类时区相关特性,要到GCC 11及以后的版本才正式加入。GCC 10仅支持了C20的部分核心语法,库层面的时区组件还未开发完成。不同编译器的更新节奏存在差异
各家编译器对新标准的跟进速度不一样:- Visual Studio的MSVC很早就完成了C++20时区特性的支持,所以你的代码在Windows环境能正常编译。
- GCC的标准库更新节奏稍慢,后续版本才补全了这部分功能。
解决办法
要在树莓派上编译这段代码,需要将GCC升级到11或更高版本。可以通过Raspbian的软件源进行更新,或者手动编译安装新版本的GCC。升级完成后,再使用g++ -std=c++20 c++20.cpp命令编译即可。
内容的提问来源于stack exchange,提问作者Johnny
相关产品推荐
相关产品推荐

