私は最近、いくつかの変数についてコードベースを float から long に変更していましたが、まだ間違っているとわかっていた領域でコンパイラによって生成されたエラー メッセージがないことを発見しました。これにより、コンパイラ フラグに -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
本当の解決策は、コンパイラをアップグレードすることです。複雑な理由で会社が喜んでやろうとしていることではありません(ため息)。