Next: , Previous: Expressions, Up: Data


8.2 プログラム変数

最も一般的に使用される式は、 ユーザ・プログラム内部の変数名です。

式の中の変数は、 選択されたスタック・フレーム (see Selecting a frame) 内において解釈されます。 これは、 以下の2つのいずれかとなります。

あるいは

つまり、 以下の例において、 ユーザ・プログラムが関数fooを実行中は、 変数aを調べたり使用したりすることができますが、 変数bを使用したり調べたりすることができるのは、 bが宣言されているブロックの内部をユーザ・プログラムが実行中である場合に限られます。

     foo (a)
          int a;
     {
       bar (a);
       {
         int b = test ();
         bar (b);
       }
     }

ただし、 これには1つ例外があります。 特定の1ソース・ファイルをスコープとする変数や関数は、 たとえ現在の実行箇所がそのファイルの中ではなくても、 参照することができます。 しかし、 このような変数または関数が (異なるソース・ファイル中に) 同じ名前で複数個存在するということがありえます。 このような場合、 その名前を参照すると予期できない結果をもたらします。 2つのコロンを並べる記法によって、 特定の関数またはファイルの中の静的変数を指定することができます。

     file::variable
     function::variable

ここでfileまたはfunctionは、 静的変数variableのコンテキスト名です。 ファイル名の場合は、 引用符を使用することによって、 GDBがファイル名を確実に1つの単語として解釈するようにさせることができます。 例えば、 ファイルf2.cの中で定義されたグローバル変数xの値を表示するには、

     (gdb) p 'f2.c'::x

のようにします。

このような‘::’の用途が、 これと非常によく似ているC++における‘::’の用途と衝突することは非常に稀です。 GDBは、 式の内部においてC++のスコープ解釈演算子の使用もサポートしています。

注意: ときどき、 新しいスコープに入った直後やスコープから出る直前に、 関数内部の特定の箇所から見ると、 ローカル変数の値が正しくないように見えることがあります。
マシン命令単位でステップ実行を行っているときに、 このような問題を経験することがあるかもしれません。 これは、 ほとんどのマシンでは、 (ローカル変数定義を含む) スタック・フレームのセットアップに複数の命令が必要となるからです。 マシン命令単位でステップ実行を行う場合、 スタック・フレームが完全に構築されるまでの間は、 変数の値が正しくないように見えることがあります。 スコープから出るときには、 スタック・フレームを破棄するのに、 通常複数のマシン命令が必要とされます。 それらの命令群の中をステップ実行し始めた後には、 ローカル変数の定義は既に存在しなくなっているかもしれません。

このようなことは、 コンパイラが重要な最適化を実施する場合にも、 発生する可能性があります。 常に正確な値が見えることを確実にするためには、 コンパイルの際に、 すべての最適化を行わないようにします。