7

私は C 言語に関する本 ( 「Mastering C」:: ) を読んでいて、Google ブックスの 203 ページのスコープ解決演算子 () に関するトピックを見つけまし

しかし、次のコード サンプル (本からコピーしたもの) を実行すると、C コンパイラでエラーが発生します。インターネットで検索しましたが、C のスコープ解決演算子への参照が見つかりません。

#include <stdio.h>
int a = 50;
int main(void)
{
    int a =10;  
    printf("%d",a);
    printf("%d\n", ::a);        
    return 0;
}

グローバル変数にアクセスしたい場合、main()関数内からどのようにアクセスできますか?

4

6 に答える 6

17

いいえ、C にはスコープ解決演算子がありません。C++ には ( ::) が 1 つあります。おそらく、あなた (またはあなたの本) は C と C++ を混同しています。

独自のローカル変数を持つa関数 (こちら) 内からグローバル変数にアクセスする方法を尋ねました。C ではこれを行うことはできません。字句的に範囲外です。もちろん、変数のアドレスを別の場所で取得して、それをポインターとして渡すこともできますが、それはまったく別のことです。変数の名前を変更するだけです。つまり、「そうしないでください」maina

于 2015-02-03T13:37:08.267 に答える
8

いいえ、名前空間は C++ の機能です。

ただし、例でグローバルを参照することは可能aです。externこれは、次のキーワードを使用して実現できます。

#include <stdio.h>

int a = 50;

int main(void)
{
    int a = 10;
    printf("%d\n",a);

    { // Note the scope
        extern int a; // Uses the global now
        printf("%d\n", a);
    }

    return 0;
}

しかし、それは少しトリッキーです。スタイル悪いよ。そうしないでください。

于 2015-02-03T13:43:20.990 に答える
5

::operator は C ではなく C++ で使用できます。グローバル変数にアクセスする場合は、

#include <stdio.h>
int a = 50;
int main(void)
{
    int a =10;
    printf("%d",a); //prints 10
    {
        extern int a;
        printf("%d", a); //prints 50
    }
    return 0;
}

または、グローバル変数のアドレスを保持するポインターを使用して、グローバル変数aの値を出力する場合はポインターを逆参照することもできますa

于 2015-02-03T13:44:10.687 に答える
3

いいえ (::演算子は C++ 固有です)。C では、重複する異なるスコープ (たとえば、ファイル スコープaとブロック スコープa) で同じ識別子を使用すると、ブロック スコープ識別子がファイル スコープ識別子をシャドウし、シャドウされた識別子を参照する方法がありません。

一般に、シャドウ変数を避けることは、プログラミングのベスト プラクティスです。多くの lint タイプのプログラムは、この状況について警告することができます。

于 2015-02-03T13:39:50.213 に答える
0

プレーン C では、スコープの解決はありません。変数に別の名前を付ける必要があります。

つまり、a以下の変数はすべて異なるものです。

#include <stdio.h>
int a = 50;
int main(void)
{
    int a = 10;
    {
        int a = 20;
        int i;
        for (i = 0; i < 10; i++) {
            int a = 30;
        }
    }
    return 0;
}
于 2015-02-03T13:42:20.110 に答える