次のコードがデバッグ ビルドでは正しく動作するが、リリースでは正しく動作しないことを発見しました。
enum FileFormatDetection
{
Binary,
ASCII,
Auto
};
FileFormatDetection detection_mode = (FileFormatDetection)ReadIntKey(NULL, KEY_ALL, "FIL_ASCIIORBINARY", -1); // Assigns -1, as confirmed by debug output
if (detection_mode < 0 || detection_mode > 2)
{
// Not a valid value, so set to default:
detection_mode = Auto;
}
各ビルドのデバッグ出力で、値が -1 であることが確認されました。デバッグ ビルドでは、値 -1 により if-branch に入りました。リリースでは、そうではありませんでした。
次のように、detection_mode を int にキャストしようとしました。
if ((int)detection_mode < 0 || (int)detection_mode > 2)
と:
if (int(detection_mode) < 0 || int(detection_mode) > 2)
しかし、どちらも違いはありません。
これを機能させる唯一の方法は、enum 変数を整数のスタック変数にキャストし、次のことをテストすることでした。
int detection_int = (int)detection_mode;
if (detection_int < 0 || detection_int > 2)
{
...
これで、予想どおり、if 分岐が入力されました。
なぜこれが必要だったのか理解できません - 元のコード (または少なくともキャストの一時的なテスト) が機能するはずだったと今でも思います。なぜそうしなかったのか誰か説明できますか?