使用c89/c99/c11忽略MinGW printf填充

使用c89/c99/c11忽略MinGW printf填充,c,gcc,printf,mingw,C,Gcc,Printf,Mingw,试图在MinGW中构建并运行这个简单的C程序会产生奇怪的结果 #include <stdio.h> void main() { printf("%03d", 7); }; 而在常规GNU C模式下,它工作正常: C:\>gcc a.c C:\>a 007 这是MinGW的一只虫子吗?我错过什么了吗?或者填充说明符真的不是标准的C特性吗 作为参考,这是我的系统上的gcc-v的输出 正如所建议的,最好的解决方法是使用MinGW-W64,它实际上是MinGW的一个

试图在MinGW中构建并运行这个简单的C程序会产生奇怪的结果

#include <stdio.h>
void main() {
    printf("%03d", 7);
};
而在常规GNU C模式下,它工作正常:

C:\>gcc a.c
C:\>a
007
这是MinGW的一只虫子吗?我错过什么了吗?或者填充说明符真的不是标准的C特性吗

作为参考,这是我的系统上的
gcc-v
的输出



正如所建议的,最好的解决方法是使用MinGW-W64,它实际上是MinGW的一个独立项目。尽管有“W64”标签,它仍然可以生成32位二进制文件。

为什么您的
main()
void main()
???我认为你测试的所有标准都是错误的。如果您正在学习,则应特别启用编译警告。我从不关闭它们,除非我构建了一个版本,在这个版本中,让编译器工作得更多是毫无意义的。但通常在调试版本中,总是
-Wall-Werror
。我喜欢让编译器尽可能地高兴,以避免自己检查愚蠢的错误。我删除了我的答案,因为有些人显然认为它是错误的,尽管没有人解释原因。如果有帮助,请告诉我。但是被否决的答案并不“有用”,所以最好删除它。谢谢@iharob,但你的观点并不是真正的问题
main
可以安全地使用错误的签名,因为它是cdecl函数(调用方清理),并且没有使用参数。显然,您的编译器没有终止的许可证。@Cauterite我建议您安装mingw-w64。它就像mingw,但更好,没有这个缺陷。
C:\>gcc a.c
C:\>a
007