MinGW不会发出警告

250*_*501 19 c windows gcc mingw

我已经在Windows 7 32位机器上成功安装了MinGW,并尝试使用命令行或MinGW控制台编译一个简单的程序.

代码在printf语句中有故意错误:

#include <stdio.h>
#include <stdlib.h>
int main( void )
{
    printf("%d\n" , 3.14 ) ;
return 0 ;
}
Run Code Online (Sandbox Code Playgroud)

该命令gcc -Wall hello.c给出了正确的警告:hello.c:7:2:警告:格式'%d'需要类型'int'的参数...

但该命令gcc -std=c99 -Wall hello.c没有给出任何警告.

两者都创建一个可执行文件a.exe(运行并给出相同的结果).

(有趣的是,命令gcc -std=gnu99 -Wall hello.c会发出警告.)

我不知道这是一个错误,还是安装出错了,但两者似乎都不太可能,因为编译器工作并成功编译了一个更大的项目(但当使用-std = c99时,同样的警告当然会被忽略).

我一定错过了一些信息.

(ps:如果有人安装了新的MinGW,请测试一下.)

gcc版本4.8.1(GCC)

更新1:

_GNU_SOURCE在包含之前定义stdio.h即使使用也会删除警告 gcc -Wall hello.c.

更新2(可能不太相关):

编译

 printf("%lf\n" , 3.14 ) ;
Run Code Online (Sandbox Code Playgroud)

-std=c99 标志输出:0.000000

-std=gnu99 输出:3.140000

并编译:

 printf("%f\n" , 3.14 ) ;
Run Code Online (Sandbox Code Playgroud)

-std=gnu99-std=c99输出:3.140000

更新3:

似乎受影响的函数是:printf,fprintf,snprintf,sprintf.

Mic*_*urr 15

使用该std=c99选项时缺少警告的问题看起来像是因为与使用时相比,使用时MinGW 4.8.1 对函数族的预处理stdio.h稍有不同.printf()-std=c99-std=gnu99

注意:我正在从TDM看MinGW 4.8.1 - 我认为其他发行版可能在这些细节上有所不同.

MinGW在格式化浮点值方面存在一些兼容性问题,因为它对msvcrt.dllC运行时的历史依赖性以及MSVC使用64位表示的事实,long double而gcc使用96位(或x64上的128位)表示.请参阅gcc:printf和long double导致输出错误.[C - 类型转换混乱]了解一些细节.更新版本的MinGW已经提供了他们自己printf()的函数系列实现(__mingw_名称前缀)libmingwex.a来解决这些问题.

头文件_mingw.hstdio.h配置是否将使用libmingwex.a实现或msvcrt.dll实现.

看来如果要求ANSI合规性,MinGW将使用这些libmingwex.a实现(还有许多其他方法来获取此配置 - 请查看标题以获取详细信息).通过定义静态内联实现来完成printf()__mingw_printf()实现的用户调用,这是一个围绕调用的瘦包装器.显然,这并不适用于编译器不相信库的一部分的族函数版本(一个合理的假设 - 编译器并不真正了解这些函数).可以通过将适当的函数属性(例如:)应用于静态内联包装函数来解决此问题.libmingwex.astdio.hprintf()__mingw_vfprintf()-Wformatprintf()__attribute__ ((format (printf, 1, 2)))

您发现的另一个问题是,在使用时printf("%lf\n", 3.14)打印,看起来是执行中的错误.似乎错误地解释为意味着论证是一个.我没有太多的惊讶-我总要回去看看是否手段或.0.000000std=c99libmingwex.a__mingw_vfprintf()__mingw_vfprintf()"%lf"long double%lfdoublelong double