2

グローバル定数に少し混乱しています。私の(初心者レベルの)理解は、「グローバル」変数はブロックの外側で定義され、プログラムの範囲を持っているということです(ソース:http://www.learncpp.com/cpp-tutorial/42-global-variables/)。しかし、プログラム:

#include <iostream>

const double x=1.5;

int main(){
        std::cout << "1) x=" << x << std::endl;
        double x=2.5;
        std::cout << "2) x=" << x << std::endl;
        //const double x=3.5;
        return 0;
}

-Wall を使用しても、問題なく g++ (GCC、最新の 64 ビット バージョン) でコンパイルできます。

出力:

1) x=1.5
2) x=2.5

これは私を混乱させます。最初の cout が評価されるという事実は、メインが「x」を「グローバル」変数として認識することを意味します (メインのスコープでは定義されていません)。その場合、なぜ「x」を再定義できるのでしょうか?

次に、コメント化された 3 番目の宣言のコメントを解除すると、g++ は再宣言エラーをスローします。つまり、私の最初の宣言は、私が定義した意味で「グローバル」であってはなりません:S

編集: わかりました、質問はグローバル変数とは関係ありませんが、スコープ: たとえば、 http://pastebin.com/raw.php? i=V5xni19Mの同じ問題

4

6 に答える 6

8
#include <iostream>

const double x=1.5;

コードのこの時点ではx、グローバル スコープで名前が付けられた 1 つのオブジェクトがあり、そのタイプはconst doubleです。

int main(){
        std::cout << "1) x=" << x << std::endl;

この時点ではまだ 1 つしかx表示されていないため (グローバル 1 つ)、それが名前のx意味です。

        double x=2.5;

コードのこの時点で、 という名前のオブジェクトxを のスコープに導入しましたmain()。そのスコープはグローバル スコープ内にネストされているため、次の名前の 2 つのオブジェクトがありますx

  1. x型のグローバル スコープ内const double

  2. xmain()型のスコープ内double

ローカルxはグローバルを隠しxます。x内のグローバルにアクセスする場合はmain()、 として参照できます::x

    std::cout << "2) x=" << x << std::endl;
    double x=3.5;  //uncommented

いいえ、名前付きの別のオブジェクトxを のスコープに導入しようとしていますmain()。これは不可能xです。そのスコープには既に 1 つあるため、失敗します。

于 2013-10-11T14:18:46.513 に答える
1

2 番目xは再定義ではありません。それはhidingグローバルxです。これは、特に継承を扱う場合に注意する必要があります。

  struct Base 
  {
      void AwesomeFunction() { }
  };

  struct Derived : public Base
  {
      // This definition 'hides' Base::AwesomeFunction
      void AwesomeFunction() { }
  };

xこの非表示は、2 番目のスコープが global よりも小さいスコープにあるためにのみ許可されxます。x3 番目と 2 番目xが同じスコープ「レベル」にあるため、3番目の redfinition エラーが発生します。

于 2013-10-11T14:16:54.253 に答える
1

::x を使用して、プログラムからグローバル変数にアクセスします。現在、ローカル変数とグローバル変数を作成しています。最初に x を印刷すると、ローカルのものを見つけることができないため、グローバルを意味していると想定されます。ローカル x を作成すると、デフォルトでグローバルにはなりません。

于 2013-10-11T14:16:54.733 に答える
1

コードで何が起こるかというと、同じ名前を使用する場合、ローカル変数がグローバル変数よりも優先されます。プログラム全体の任意のブロックでグローバル変数を使用できますが、ローカル変数はそのブロック (メイン) の最後で破棄されます。ただし、コンパイラでは、1 つのブロックで同じ名前の 2 つのローカル変数を宣言することはできません。

于 2013-10-11T14:17:05.920 に答える
1

内部スコープ (main など)での宣言は、外部スコープ (ファイル スコープなど) での宣言をシャドウすることができます。x の 3 番目の宣言は 2 番目と同じスコープにあるため、再宣言エラーです。

于 2013-10-11T14:17:14.577 に答える
1

グローバル変数を再定義していません。同じ名前の別のローカル変数を定義しています。

C++ を使用すると、名前を再利用して、このように狭い範囲で別のものを宣言できます。技術的には、内部スコープの宣言は外部スコープの宣言を隠して、宣言と関数の終わりの間でxローカル変数を参照するようにします。名前空間で修飾することにより、引き続きグローバル変数にアクセスできます: ::x.

3 番目の宣言は、同じスコープ内で名前を再利用しようとしますが、これは許可されていません。

于 2013-10-11T14:17:49.957 に答える