【发布时间】:2010-10-19 11:07:45
【问题描述】:
我最近将我们的代码库从浮点数更改为长整数,发现编译器在我知道仍然错误的区域没有生成错误消息。这导致我将 -Wconversion 添加到编译器标志中。但是,哎呀,这会导致一些虚假的错误消息。在下面的 sn-p 中,我得到了如上所述的错误。我能做些什么来根据具体情况抑制此消息,或者诱使 gcc 对此更聪明? -Wconversion 标志在我们的代码库中生成数千条警告。我将不得不检查它们吗?咕噜。
#include <stdio.h>
void
takes_a_float ( float some_num ) {
printf("float Hello %f\n", some_num );
}
int
main (int argc, char **argv) {
float my_boat = 1.0f;
takes_a_float ( my_boat );
exit (0);
}
gcc -Wconversion foo.c
foo.c: In function `main':
foo.c:13: warning: passing arg 1 of `takes_a_float' as `float' rather than `double' due to prototype
$ gcc -v
Reading specs from /usr/lib/gcc/x86_64-redhat-linux/3.4.6/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr /share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-java-awt=gtk --host=x86_64-redhat-linux
Thread model: posix
gcc version 3.4.6 20060404 (Red Hat 3.4.6-10)
编辑
正如 John Millikin 所指出的,-Wconversion 标志正在“按设计”工作。 (我原以为这是关于类型转换,但事实证明这是关于将真正旧的 C 风格程序转换为 ISO 标准 C。该死。阅读 gcc 警告 我的 gcc 版本的文档页面没有给我希望,但无论如何,我真正想要的是启用其他一些警告标志,以便在以下代码中正确发出警告,而不是给出虚假警告。
#include <stdio.h>
#include <stdlib.h>
void
takes_a_long ( long sad_story ) {
printf("Long %lu\n", sad_story );
}
void
takes_a_float ( float my_boat ) {
printf("Float %f\n", my_boat );
}
int
main (int argc, char **argv) {
float my_boat = 1.0f;
long sad_story = 1.0L;
// No warnings wanted
takes_a_float (my_boat);
takes_a_long (sad_story);
// Warnings required
takes_a_long (my_boat);
takes_a_float (sad_story);
exit (0);
}
编辑 2
真正的解决方案是升级我的编译器。公司出于复杂的原因不愿意做的事情(叹气)。
【问题讨论】:
标签: c gcc gcc-warning