GCC の -Wconversion 警告フラグを使用してプロジェクトをビルドしています。(gcc (Debian 4.3.2-1.1) 4.3.2) 64 ビット GNU/Linux OS/ハードウェア上。型を混在させたり、どの型を使用する必要があるかについて明確性を失った場所を特定するのに役立つと思います。
警告をアクティブにする他のほとんどの状況ではあまり役に立ちません。これらにどのように対処するつもりなのかを尋ねています。
enum { A = 45, B, C }; /* fine */
char a = A; /* huh? seems to not warn about A being int. */
char b = a + 1; /* warning converting from int to char */
char c = B - 2; /* huh? ignores this *blatant* int too.*/
char d = (a > b ? b : c) /* warning converting from int to char */
上記のテスト (ケースa
およびc
) の予想外の結果のため、これらの違いについても説明を求めています。
編集:そして(char)
、警告を防ぐためにこれらすべてをキャストするのは過剰なエンジニアリングですか?
Edit2:いくつかの追加のケース(上記のケースに続く):
a += A; /* warning converting from int to char */
a++; /* ok */
a += (char)1; /* warning converting from int to char */
それとは別に、私が求めているのは主観的なものであり、一部の開発者がすべての警告を削除することを提唱していると考えると、このような場合に他の人が変換警告にどのように対処するかを聞きたい.
やえ:
考えられる解決策の 1 つは、int
s の代わりにchar
s を使用することですよね?実際には、次のコードで示されているように、より多くのメモリが必要になるだけでなく、速度も遅くなります。数式は、 でビルドしたときに警告を表示するためだけに存在します-Wconversion
。char
変数を使用するバージョンは、変換のために s を使用するバージョンよりも遅く実行されると想定しましたint
が、私の (64 ビット デュアル コア II) システムでは、int
バージョンの方が遅くなります。
#include <stdio.h>
#ifdef USE_INT
typedef int var;
#else
typedef char var;
#endif
int main()
{
var start = 10;
var end = 100;
var n = 5;
int b = 100000000;
while (b > 0) {
n = (start - 5) + (n - (n % 3 ? 1 : 3));
if (n >= end) {
n -= (end + 7);
n += start + 2;
}
b--;
}
return 0;
}
gcc に渡し-DUSE_INT
て、上記のスニペットの int バージョンをビルドします。