gpt4 book ai didi

c - MinGW 的 msvcrt 替代品? (例如,获得符合要求的 snprintf)

转载 作者:行者123 更新时间:2023-12-04 10:11:35 27 4
gpt4 key购买 nike

这是一个有趣的...

我们有一些 C 库,它们应该是平台无关的,即使它们是在 linux 上开发的,因为它们只依赖于 ISO/IEC 9899:1999 中定义的 c 标准库。当我们用 MinGW 编译这些库时,一开始一切似乎都运行良好,但今天我们发现 msvcrt 的 snprintf() 实现是 braindea...抱歉,我的意思是“不兼容/strong>"与 C99 标准中的定义。

我本以为 MinGW 会发出警告,告诉我 -std=c99 实际上并未得到完全支持。因为否则,我怎么知道?

Windows 是否有任何替代的 c 标准库,最重要的是:MinGW 能否以某种方式被告知链接到它而不是 msvcrt?

如果没有,我们至少需要一个列表或其他可以检查有关 msvcrt 和 c99 的其他潜在可移植性问题的东西。

附言:我知道 Cygwin 和 MSYS2,但我更愿意使用 native Windows 二进制文件(部分原因是我们还在 Matlab 中使用我们的库)。

编辑:抱歉,我应该更清楚地解释我的 msvcrt 的 snprintf() 问题到底是什么。根据标准,如果输出不合适,则 snprintf() 需要输出 '\0' 作为最后一个字符。但是,msvcrt 只是不这样做,因此生成的字符串不再正确终止。我不知道为什么有人会选择以这种方式实现 snprintf(),因为对我来说,只是省略 '\0' 根本没有任何意义。

我们也尝试了建议的 __USE_MINGW_ANSI_STDIO,但我想这只是修复了缺失的格式说明符?至少它似乎对我们的具体问题没有影响。

最佳答案

标准强制 snprintf 的行为如下:

Otherwise, output characters beyond the n-1st are discarded rather than being written to the array, and a null character is written at the end of the characters actually written into the array.

msvcrt 中的

snprintf 确实不是标准版本,而是 Microsoft 版本,如下所述:
Is snprintf() ALWAYS null terminating?

以下代码给出了不合规的结果:

#include <stdio.h>

int main (void)
{
char dst[3];
snprintf(dst, 3, "%c%c%c", 'A', 'B', 'C');

for(size_t i=0; i<3; i++)
{
printf("%.2X ", dst[i]);
}
}

我得到的输出 41 42 43 不符合标准。要获得标准 C,您必须在 stdio.h 包含的 之前添加:

#define __USE_MINGW_ANSI_STDIO 1

现在您得到符合要求的 41 42 00

所有这些程序安全问题的根源是微软,他们在过去 20 年中一直在其产品中使用不合规的 C 库。

关于c - MinGW 的 msvcrt 替代品? (例如,获得符合要求的 snprintf),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57604482/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com