草庐IT

c - MinGW 不产生警告

coder 2023-11-09 原文

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

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

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

命令 gcc -Wall hello.c 给出了正确的警告:hello.c:7:2: warning: format '%d' expects argument of type '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:

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

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

编译

 printf("%lf\n" , 3.14 ) ;

-std=c99 标志输出:0.000000

-std=gnu99 输出:3.140000

和编译:

 printf("%f\n" , 3.14 ) ;

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

更新 3:

似乎受影响的函数有:printf、fprintf、snprintf、sprintf。

最佳答案

使用 std=c99 选项时缺少警告的问题看起来是因为 MinGW 4.8.1 预处理 stdio.h 对于 有点不同>printf() 使用 -std=c99 时与使用 -std=gnu99 时的函数系列。

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

MinGW 在格式化浮点值方面存在一些兼容性问题,因为它对 C 运行时的 msvcrt.dll 的历史依赖以及 MSVC 使用 64 位表示的事实 long double 而 gcc 使用 96 位(或 x64 上的 128 位)表示。参见 gcc: printf and long double leads to wrong output. [C - Type conversion messes up]一些细节。较新版本的 MinGW 在 libmingwex.aprintf() 函数系列实现(名称带有 __mingw_ 前缀) 来解决这些问题。

头文件 _mingw.hstdio.h 配置是 libmingwex.a 实现还是 msvcrt。 dll 实现将被使用。

看来,如果要求符合 ANSI,MinGW 将使用 libmingwex.a 实现(还有许多其他方法也可以获取此配置 - 查看标题了解详细信息)。将对 printf() 的用户调用连接到 libmingwex.a 中的 __mingw_printf() 实现由 stdio.h<> 定义 printf() 的静态内联实现,它是对 __mingw_vfprintf() 调用的简单包装。显然 -Wformat 不会应用于编译器认为不属于库的一部分的 printf() 系列函数的版本(一个合理的假设 -编译器实际上对这些函数一无所知)。可以通过将适当的函数属性(例如:__attribute__ ((format (printf, 1, 2)))))应用于静态内联包装函数来解决此问题。

您发现的另一个问题,其中 printf("%lf\n", 3.14) 在使用 std=c99 时打印 0.000000,看起来是 __mingw_vfprintf()libmingwex.a 实现中的错误。似乎 __mingw_vfprintf() 错误地将 "%lf" 解释为参数是一个 long double。我对此并不感到惊讶 - 我总是需要查找 %lfdouble 还是 long double

关于c - MinGW 不产生警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27363795/

有关c - MinGW 不产生警告的更多相关文章

  1. ruby - 在院子里用@param 标签警告 - 2

    我试图使用yard记录一些Ruby代码,尽管我所做的正是所描述的here或here#@param[Integer]thenumberoftrials(>=0)#@param[Float]successprobabilityineachtrialdefinitialize(n,p)#initialize...end虽然我仍然得到这个奇怪的错误@paramtaghasunknownparametername:the@paramtaghasunknownparametername:success然后生成的html看起来很奇怪。我称yard为:$yarddoc-mmarkdown我做错了什么?

  2. ruby-on-rails - active_admin 目录中的常量警告重新声明 - 2

    我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA

  3. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  4. ruby-on-rails - 我更新了 ruby​​ gems,现在到处都收到解析树错误和弃用警告! - 2

    简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und

  5. ruby - 警告 : PATH set to RVM ruby but GEM_HOME and/or GEM_PATH not set, 请参阅 : https://github. com/wayneeseguin/rvm/issues/3212 - 2

    我每次打开终端时都会收到这个错误:警告:PATH设置为RVMruby​​但未设置GEM_HOME和/或GEM_PATH,请参阅:https://github.com/wayneeseguin/rvm/issues/3212这是在我最近安装zsh(oh-my-zsh)后开始发生的我不知道如何设置GEM_HOME和/或GEM_PATH的路径。 最佳答案 我也面临同样的问题,更改.zshrc中的以下行,exportPATH="/usr/local/heroku/bin:.........."到exportPATH="$PATH:/usr/

  6. ruby - 猴子修补 float 中缀运算符产生意想不到的结果 - 2

    重新定义Float#/似乎没有效果:classFloatdef/(other)"magic!"endendputs10.0/2.0#=>5.0但是当另一个中缀运算符Float#*被重新定义时,Float#/突然采用了新的定义:classFloatdef/(other)"magic!"enddef*(other)"spooky"endendputs10.0/2.0#=>"magic!"我很想知道是否有人可以解释这种行为的来源,以及其他人是否得到相同的结果。ruby:ruby2.0.0p353(2013-11-22)[x64-mingw32]要快速确认错误,请运行thisscript.

  7. ruby - 有没有办法让 2.4.0 中的 Ruby 弃用警告静音? - 2

    从Ruby2.4.0开始,对于使用某些已弃用的功能,会出现弃用警告。例如,Bignum、Fixnum、TRUE和FALSE都会触发弃用警告。当我修复我的代码时,有相当多的代码我希望它保持沉默,尤其是在Rails中。我该怎么做? 最佳答案 moduleKerneldefsuppress_warningsoriginal_verbosity=$VERBOSE$VERBOSE=nilresult=yield$VERBOSE=original_verbosityreturnresultendend>>X=:foo=>:foo>>X=:bar

  8. ruby - 在 Ruby 中,如何在加载 YAML 文档时警告散列中的重复键? - 2

    在下面的Ruby示例中,是否有一种模式可以让YAMLNOT静默忽略重复键“one”?irb(main):001:0>require'yaml'=>trueirb(main):002:0>str='{one:1,one:2}'=>"{one:1,one:2}"irb(main):003:0>YAML.load(str)=>{"one"=>2}谢谢! 最佳答案 使用Psych,您可以遍历AST树以查找重复键。我在我的测试套件中使用以下辅助方法来验证我的i18n翻译中没有重复键:defduplicate_keys(file_or_cont

  9. ruby-on-rails - 如何在 Rails 中启用 Ruby 警告? - 2

    我在test.rb中做了这个:defsome_methodp"Firstdefinition"enddefsome_methodp"Seconddefinition"endsome_method当我调用rubytest.rb时,它打印出Seconddefinition(预期)当我调用ruby-wtest.rb时,它会打印Seconddefinition(预期)并打印警告test。rb:5:警告:方法重新定义;丢弃旧的some_method有没有办法在Rails中启用这些警告?(并将警告打印到控制台/日志文件)为什么我要启用警告:例如,如果我无意中重新定义Controller中的一个方法

  10. ruby - 为什么 Gemfile 语义版本控制运算符 (~>) 会产生与一个数字不一致的结果? - 2

    gemspec语义版本控制运算符~>(又名twiddle-wakka,又名pessimistic运算符)允许限制gem版本但允许进行一些升级。我经常看到它可以读作:"~>3.1"=>"Anyversion3.x,butatleast3.1""~>3.1.1"=>"Anyversion3.1.x,butatleast3.1.1"但是有了一个数字,这条规则就失效了:"~>3"=>"Anyversionx,butatleast3"*NOTTRUE!*"~>3"=>"Anyversion3.x"*True.Butwhy?*如果我想要“任何版本3.x”,我可以只使用“~>3.0”,这是一致的。就

随机推荐