8

この質問は、ここでその後に尋ねられた質問と密接に関連しています。

クラス内定数を定義する方法は、Stroustrup によって ここで説明されています。

Stroustrup の方法に従うと、期待どおりの結果が得られます。ただし、Visual Studio 2010 では、デバッガーはstatic constそのクラスのスコープ内でクラス メンバーを解決できません。これが私が意味することです:

#include <iostream>

class Foo {
   public:
    static const int A = 50;
    char arr[A];
    void showA();
};

void Foo::showA() {
    std::cout << "showA = " << A << "\n";
}

int main() {
    Foo f;
    f.showA();
}

デバッガーが showA() にある場合、「ウォッチ」ウィンドウは次のように報告します。

Error: Symbol "Foo::A" not found

プログラムが期待どおりに動作することを強調したいと思います。つまり、出力は次のようになります。

showA = 50

プログラムは 0 を返します。

他の誰かが Visual Studio 2010 でこれを再現できますか? これはデバッガのバグですか?

4

3 に答える 3

7

グローバル名前空間スコープで静的データ メンバーの定義を追加できます。

const int Foo::A;

必要ではないが許可されている静的データメンバー定義を追加すると、問題が解決するようです。

VS2010 を使用したデバッグ ビルドでこれをテストしましたA。定義が存在する場合、値がデバッグ ウィンドウに正しく表示されます (一方、定義が欠落している場合はエラー メッセージが報告され、言及した内容と一致します)。

于 2013-05-03T19:06:25.340 に答える
3

これはバグではありません。コンパイラは、静的定数の基本型を最適化できます (ほとんどの場合そうします)。にストレージを割り当てる代わりに、コンパイラは の値をコンパイル済みの命令にAインライン展開するだけです。A

Aどこにも保存されていないため、アドレスがないため、デバッガーは表示できません。

于 2013-05-03T19:04:29.780 に答える