c++ - ctime, time.h, sys/time.h 乱七八糟
问题描述
我希望一些 Linux 死忠可以回答我在使用时间函数时应该如何编写可移植 (POSIX) 代码。
一些 SO 线程建议在编写 C++ 代码时包含 ctime 是正确的做法,而对于 C 代码,您仍然会包含 time.h。但是,它们都定义了相同的函数,尽管在不同的命名空间中。从技术上讲,您应该能够同时指定两者。
一篇 SO 帖子建议应该避免使用基于 sys/* 的包含所有内容。
.. 虽然这个线程暗示 sys/time.h 必须在 sys/resources.h 被包含之前被包含,特别是对于基于 BSD 的平台。
这篇文章说包含 sys/time.h 可以提高可移植性。我想张贴者认为它允许您链接更多使用 gettimeofday 等特定功能的 3rd 方库.. 但是..
gettimeofday()已被劝阻,现在正处于弃用状态,所以我应该使用 clock_gettime() 代替。此clock_gettime()在time.h 中定义,见https://linux.die.net/man/3/clock_gettime ..
.. 如果安装并与 libavutil 链接(例如,作为 ffmpeg-dev 的一部分),很明显time.h 的创建是为了让人们发疯。Ffmpeg(和其他一些库)有它自己的 time.h,甚至 timeb.h。事实证明,如果您的构建堆栈中的任何 .c 或 .cpp 曾经包含time.h,并且包含路径包含多个有效条目(包括 ffmpeg 的条目),则它可能引用错误的条目,并且声明被简单地替换。@ FFmpeg,原因似乎是丑陋的黑客足以解决问题。我还没有那么幸运。此外,对所有资源进行 PHP 化处理听起来根本不是一个解决方案。
另一个 time.h 存在于我系统上的 usr/include/i386-linux-gnu/bits 中,所以这也不是 ffmpeg 独有的现象。简单地将 usr/include/i386-linux-gnu 称为包含路径因此变得致命,这在提及系统包含时很奇怪。
我重写了我的 CMake 脚本,注意为大多数目标使用专用的包含文件夹规范。我尝试在整个代码库中引用的预编译头文件中包含 time.h/ctime 和 sys/time.h 的各种排列。我仍然收到如下错误:
错误:字段“st_atim”的类型“timespec”不完整,struct timespec st_atim;
错误:'::time' 尚未声明
ETC..
那么,对于与许多第 3 方依赖项链接的 C++ 设置,确保所有内容都继续编译(包括 time.h)的正确方法是什么?我应该将系统的 time.h 包含在我正在编译的特定平台上吗?我应该检查所有可能需要 time.h 的目标吗?跳舞的大象和五彩纸屑摆在前面。
更新:该问题似乎与 C++ 的版本有关,正如以下评论中所暗示的那样。我已经将 gcc 更新到 8.3.0(从 5.4),并且我已经放弃了在 linux 上支持低于 c++11 的旧 c++ 兼容性。在更新和重建所有 3rd 方包(包括 ffmpeg)之后,我现在不再遇到我描述的问题,但这并不意味着它已经修复,因为它不会再次发生在其他人身上。事实上,我认为问题主要在于 ffmpeg 如何在较旧的编译器上编译并且没有明确要求 c++11,所以我将其保持打开状态。
解决方案
date
我建议您考虑一下已被下一版本C++
标准库 ( C++20
)接受的 Howard Hinnant 的库:
https://github.com/HowardHinnant/date
它应该可以在任何支持C++11
更高版本的平台上运行。
推荐阅读
- python - 如何在python中读取时跳过csv文件中的标题行
- android - 如何为 ViewPager2 设置背景以使图像仅在左侧具有圆角?
- graphql - 使用 GraphQl+ReScript 上传文件
- r - 是否可以将我的 glmer 模型反向转换为 emmeans posthoc 测试?
- postgresql - 无法将 Aurora RDS Postgres 版本从 12 升级到 13
- rabbitmq - 每 10 分钟在 RabbitMQ 上发现错误“CRASH REPORT Process”
- dialogflow-es - Google Conversational Actions 中的verificationStatus、accountLinkingStatus、UserStorage 和用户ID 的管理
- spring - 无法将 Maven 配置文件绑定到 Spring Boot 配置文件
- java - 多个 ISO 8601 到 ZonedDateTime 解析方法之间的区别
- javascript - 如何制作具有相同高度内容元素的相同高度卡片