1

コードを持つ:

Date::Date(const char* day, const char* month, const char* year):is_leap__(false)
{
    my_day_ = lexical_cast<int>(day);


    my_month_ = static_cast<Month>(lexical_cast<int>(month));

    /*Have to check month here, other ctor assumes month is correct*/
    if (my_month_ < 1 || my_month_ > 12)
    {
        throw std::exception("Incorrect month.");
    }
    my_year_ = lexical_cast<int>(year);

    if (!check_range_year_(my_year_))
    {
        throw std::exception("Year out of range.");
    }

    if (check_leap_year_(my_year_))//SKIPS THIS LINE
    {
        is_leap__ = true;
    }
    if (!check_range_day_(my_day_, my_month_))
    {
        throw std::exception("Day out of range.");
    }

}

bool Date::check_leap_year_(int year)const//IF I MARK THIS LINE WITH BREAKPOINT I'M GETTING MSG THAT THERE IS NO EXECUTABLE CODE IS ASSOSIATED WITH THIS LINE
{
    if (!(year%400) || (year%100 && !(year%4)))
    {
        return true;
    }
    else
    {
        return false;
    }
}

私の意見では、これは非常に奇妙です。私のコードにはこの fnc への呼び出しがありますが、コンパイラがそれを無視するのはなぜですか。
PSリリースでデバッグしようとしています。

4

2 に答える 2

1

リリースでデバッグしようとすると、苦痛につながります。関数はインライン化されているので、中断することはできません。この種の最適化はどこでも行われ、変数の値がずれているように見えます。デバッグでデバッグするのが最適です。

ちなみに、次のようにしてください。return !(year%400) || (year%100 && !(year%4));


「インライン化された」とは、その部分でコードが次のようになったということです。

if (!(my_year_%400) || (my_year_%100 && !(my_year_%4)))
{
    is_leap__ = true;
}

関数呼び出しはなく、中断するものもありません。

于 2010-04-04T15:19:08.610 に答える
0

実際、関数ヘッダーは実行可能コードにコンパイルされません。左中括弧または関数の最初のステートメントにブレークポイントを設定してみてください。

于 2010-04-04T15:16:10.057 に答える