我最近将我们的代码库从浮点数更改为长变量,发现编译器在我知道仍然错误的区域没有生成错误消息。这导致我将 -Wconversion 添加到编译器标志中。但是,哎呀,这会导致一些虚假的错误消息。在下面的代码段中,我得到了如上所述的错误。我该怎么做才能根据具体情况抑制此消息,或者哄 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
真正的解决方案是升级我的编译器。出于复杂的原因,这不是公司愿意做的事情(叹气)。