私はこれに2日間答えを探しましたが、成功しませんでした。私はこの問題に遭遇したことがないので、私はベストを尽くします。私と一緒に抱きしめてください。C++コードが最適化されずにスキップされることがあります。なぜどんなアイデア?
私は1年以上前に作成したC++プロジェクトに戻ってきましたが、その時点では問題なく動作していました。私は同じプログラムを動かそうとしていた頃、この面白いと信じられないほど面倒な問題に遭遇しました。
ファイル.h一定の数字は、私はこの例では、拡張16進表記のマクロた
...
short id;
...
file.cc
id = 0;
while (id < some_large_number)
{
id = foo();
if (id == 2)
{
//do something
}
else if (id == 2900)
{
//do something
}
else if (id == 30000)
{
//do something
}
else if (id == 40000)
{
//do something
}
else if (id == 45000)
{
//do something
}
else
{
//do something else
}
}
:コードのようなものでした。これは本当にバグだったが、デバッガは簡単に見つけられなかったことが分かる。
GDB(最適化なし)を使用してコードをステップ実行しようとしていたときに、毎回if (id == 30000)
に達した後、GDBがelseステートメントに直接ジャンプすることに気づきました。数字は16進表記のcマクロであるため、最初に40000
がsigned short
の制限を超えていることに気付かなかった。これは非常に誤解を招き、それを理解しようと時間を費やしました。私は外部ライブラリを再コンパイルし、g ++を再インストールしました。
明らかに、id
をunsigned short
に修正すると問題が解決しました。もう1つの問題はコンパイラの問題のようです。しかし、私はまだ理解していません。実行中にコードのセクションが完全にスキップされ、最適化されていないのはなぜですか?なぜそれが各if
の声明を通らないのでしょうか?それで私は本当の問題を特定することができましたか?何か案は?
ありがとうございます。私はこれが最初の質問のために大丈夫だと思います。
C++でマクロを使用して、あなたが求めるものを入手してください。 – Puppy
コンパイラは警告しませんでしたか?余分な警告がなくても、g ++ 4.5はケースラベルがそのタイプの最大値を超えていると不満を持ちます。他のコンパイラでは、いくつかのフラグを付けて余分な警告を追加したいかもしれません。 *すべての警告を読んで、読んで、修正することを学ぶ*。 –
コンパイラは私に警告しませんでした。そして、私はウォールオプションを設定しました。しかし、if文を変更してケースを切り替えると、警告が表示されます。私が使用しているコンパイラのバージョンはg ++ 4.4.3です。 – lospro7