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_sasctime_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_sasctime_s

【讨论】:

【参考方案2】:

MinGW-w64 提供了启用安全 CRT 功能的选项。请注意,Windows XP 存在兼容性问题,其中 msvcrt.dll 不包含这些功能,您的应用程序将无法在该环境中运行。

这些在C11 Annex K 中标准化,这是可选的,在符合 C11 的系统上可能会缺失。

【讨论】:

以上是关于mingw中的时间函数的主要内容,如果未能解决你的问题,请参考以下文章

Windows 中的 Libmtp (msys/mingw):运行问题

SDL2 未定义对 MinGW 的几个函数的引用

从 MinGW 调用 MSVC DLL 函数

GCC (MingW-w64) 找不到基础构造函数 (!?)

使用 MinGW 对 DevIL 函数的未定义引用

使用 gcc (resp. MinGW) 编译器的 C 中函数的参数数量是不是有上限?