作者:zengshiming | 来源:互联网 | 2022-11-23 09:58
某些C++实现(例如,电池供电的嵌入式设备)可能没有用或无法跟踪当前的日期和时间.
的C标准具体地允许这样的实施方式.引用ISO/IEC 9899:1999 7.23.2.4(强调我的):
time函数返回实现对当前日历时间的最佳近似值.如果日历时间不可用,则返回值(time_t)( - 1).
C++ 11引入了chrono
库和std::chrono::system_clock::now()
函数,用于从系统范围的实时时钟获取挂钟时间.该函数被声明为noexcept
,因此它不能抛出任何异常来指示不可用,也不允许返回任何特殊值(如-1
C的情况).
但是对于C++ 11,C++ 14和C++ 17,仍然存在漏洞.标准没有指定时钟的纪元,因此符合要求的实施可以将纪元设置为启动时(或程序启动)并仍满足标准要求的时间点.
目前的C++ 20草案将填补这个漏洞并需要system_clock
使用Unix时间.换句话说,不知道当前时间的C++实现是不符合的.
这是标准委员会的疏忽吗?符合标准的C++实现如何表明它不知道当前的日期和时间?
(请注意,在标准的其它部分这一问题得到解决.例如,一个实现可以设置__TIME__
和__DATE__
宏来实现自定义的值,如果实际时间和日期不详).
1> Nicol Bolas..:
知道时间和知道正确的时间之间有所区别.
如果打开这样的设备,它可以自由地假设其CPU周期计数器(或任何功率steady_clock
)表示自UNIX时间以来的周期数.也就是说,它可以假设它在UNIX时代的那一刻被启动.这将是一个有效的实现system_clock
.从某种意义上说,那个时间可能不正确,但它将是一个符合C++ 20的实现.
标准只需system_clock
要将时代作为UNIX时间(或者更具体地说,我们都可以假设它是UNIX时间).这并不意味着为时钟检索的滴答计数保证是全局准确的当前时间.毕竟,用户可以在技术上改变当前时间,这意味着要反映出来system_clock
(这就是为什么它不需要是一个稳定的时钟).
因此,你永远不能假设system_clock
准确地代表当前时间; 它只代表操作环境认为的当前时间.所以没有办法chrono
解释当前时间在某种意义上是否"正确".
system_clock
基本上是为了提供最接近系统可以提供或理解的正确时间的任何东西.如果系统能做的最好的事情是假设设备在UNIX时代开启,那就是你得到的.
此外,由于system_clock
(并且所有
这些)不在独立需求列表中,因此这些设备的C++实现可以是独立实现.因此他们选择不实施system_clock
(或全部
).
@Norask:`
`是一个标题,而不是一个库.只有一个标准库.是的,对于独立式实现,并非所有部分都必须提供.这就是为什么我说,"因此他们选择不执行`system_clock`(或所有的``)."