mingw中的时间函数
Posted
技术标签:
【中文标题】mingw中的时间函数【英文标题】:Time functions in mingw 【发布时间】:2013-06-13 11:10:26 【问题描述】:我正在尝试实现此页面中给出的代码
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366062%28v=vs.85%29.aspx
我正在使用 mingw (gcc) 来编译它。 但以下行无法编译。我已经包括了'time.h'。我搜索但在 gcc 中找不到这个 '_localtime31_s' 或其等效项。
error = _localtime32_s(&newtime, (__time32_t*) &pAdapter->LeaseObtained);
error = asctime_s(buffer, 32, &newtime);
这里的时间函数在哪里? 谢谢
【问题讨论】:
如果这不是在线程中运行的代码,则使用localtime
,但这可能是“不可重入的”。
还有asctime(buffer, &newtime)
尝试过并且工作正常。在这种情况下,函数参数和返回值是不同的。没有错误规定。任何解决方法来保持相同的程序流程?但为什么? gcc 没有 '_localtime32_s' 或 'asctime_s' 这样的实现?谢谢
我会在答案中更好地解释。
【参考方案1】:
函数localtime_s
和asctime_s
是Microsoft 特定的扩展,由(某些版本的)MS 运行时库提供。这是由 MS 头文件提供的。由于这些是版权 MS 并且不允许免费分发,因此 mingw 提供了自己的标头版本 - 这些可能不包含这些扩展名(当我在本地机器上使用 mingw 时它们肯定没有一段时间 - 我的主要这些天机器运行Linux ...)。
请注意,将时间值转换为 time32_t *
可能是个坏主意 - 如果您使用不是 32 位值的 time_t
编译代码,它几乎肯定会咬到您。
localtime_r
函数是一个半标准版本,可以用来代替 localtime_s
(您需要注意 32 位与 64 位的时间值)。您当然也可以使用localtime
(除了必须关闭 MS 烦人的“此功能不安全,请改用..._s
” - 我不真的想转换我的 100 次使用strcpy 到 strcpy_s 的工作非常好,因为它已经在其他地方检查过)。
同样有asctime_r
提供可重入版本。
也许,您也可以将这些函数的原型添加到您的文件中的某个地方,我相信只要您为 Windows 编译,就可以解决问题:
链接到 MS 函数文档:localtime_s
和 asctime_s
。
【讨论】:
【参考方案2】:MinGW-w64 提供了启用安全 CRT 功能的选项。请注意,Windows XP 存在兼容性问题,其中 msvcrt.dll 不包含这些功能,您的应用程序将无法在该环境中运行。
这些在C11 Annex K 中标准化,这是可选的,在符合 C11 的系统上可能会缺失。
【讨论】:
以上是关于mingw中的时间函数的主要内容,如果未能解决你的问题,请参考以下文章
Windows 中的 Libmtp (msys/mingw):运行问题