【发布时间】:2019-08-22 07:50:16
【问题描述】:
所以这是一个有趣的...
我们有一些 C 库应该独立于平台,即使它们是在 linux 上开发的,因为它们只依赖于 ISO/IEC 9899:1999 中定义的 c 标准库。当我们用 MinGW 编译这些库时,起初一切似乎都运行良好,但今天我们发现 msvcrt 的 snprintf() 实现是braindea ......对不起,我的意思是“不兼容" 与 C99 标准中的定义。
我本以为 MinGW 会发出警告,告诉我 -std=c99 实际上并不完全受支持。因为不然,我怎么知道?
是否有任何用于 windows 的替代 c 标准库,最重要的是:MinGW 是否可以以某种方式被告知链接它而不是 msvcrt?
如果没有,我们至少需要一个列表或其他东西,以便我们检查有关 msvcrt 和 c99 的其他潜在可移植性问题。
PS: 我知道 Cygwin 和 MSYS2,但我宁愿拥有原生 Windows 二进制文件(部分原因是我们也在 Matlab 中使用我们的库)。
编辑: 抱歉,我应该更清楚地解释我对 msvcrt 的 snprintf() 的问题到底是什么。根据标准,如果输出不合适,则需要 snprintf() 输出 '\0' 作为最后一个字符。但是, msvcrt 只是不这样做,因此生成的字符串不再正确终止。我不知道为什么有人会选择以这种方式实现 snprintf(),因为对我来说只是省略 '\0' 根本没有任何意义。
我们也尝试了建议的 __USE_MINGW_ANSI_STDIO,但我想这只是修复了缺少的格式说明符?至少它似乎对我们的具体问题没有影响。
【问题讨论】:
-
@lundin:我重新打开了,因为它不再与副本匹配
-
“因为对我来说只是省略 '\0' 根本没有任何意义。” 更可怕的想法是它100% 完全有意义 这就是它以这种方式工作的原因。
-
我无法重现该问题。请在您的问题中包含minimal reproducible example,以证明您在使用
snprintf时遇到的问题。 -
@AnttiHaapala 它仍然是重复的。哦,好吧,我会在这里发布答案......