22

グローバルに宣言された変数はプログラムスコープ
を持っていると言われますstaticキーワードでグローバルに宣言された変数はファイルスコープを持っていると言われます。

例えば:

int x = 0;             // **program scope**   
static int y = 0;      // **file scope**  
static float z = 0.0;  // **file scope** 

int main()  
{  
   int i;   /* block scope */  
   /* .
      .
      .
   */ 
   return 0;  
}  

これら2つの違いは何ですか?

4

4 に答える 4

18

として宣言された変数はstatic、他のファイルから直接アクセスできません。逆に、他のファイルのようにstatic宣言されている場合、non-ones は他のファイルからアクセスできexternます。

例:

foo.c

int foodata;
static int foodata_private;

void foo()
{
    foodata = 1;
    foodata_private = 2;
}

foo.h

void foo();

main.c

#include "foo.h"
#include <stdio.h>

int main()
{
    extern int foodata; /* OK */
    extern int foodata_private; /* error, won't compile */

    foo();

    printf("%d\n", foodata); /* OK */

    return 0;
}

一般に、グローバル変数は避けるべきです。ただし、実際のアプリケーションでは、これらが役立つことがよくあります。extern int foo;宣言を共有ヘッダー ファイル (例では foo.h)に移動するのが一般的です。

于 2012-12-25T03:09:55.643 に答える
15

C99 には、「プログラム スコープ」と呼ばれるものはありません。あなたの例では、変数xには翻訳単位の最後で終了するファイルスコープがあります。宣言されている変数yおよびもファイル スコープを持ちますが、内部リンケージがあります。zstatic

C99 (6.2.2/3) オブジェクトまたは関数のファイル スコープ識別子の宣言に static ストレージ クラス指定子が含まれている場合、識別子には内部リンケージがあります。

また、変数xには外部リンケージがあります。これは、名前xが他の翻訳単位またはプログラム全体からアクセスできることを意味します。

C99 (6.2.2/5) オブジェクトの識別子の宣言にファイル スコープがあり、ストレージ クラス指定子がない場合、そのリンケージは外部です。

于 2012-12-25T03:28:47.977 に答える
0

C プログラムは複数のファイルに記述でき、それらはリンカーによって最終的な実行に結合されます。プログラム全体が 1 つのファイルにある場合、違いはありません。しかし、個別のファイルで関数のライブラリを使用する実際の複雑なソフトウェアでは、その違いは重要です。

于 2012-12-25T03:06:05.680 に答える
0

ファイル スコープを持つ変数は、その宣言ポイントからファイルの末尾までのみ表示されます。ファイルとは、ソース コードを含むプログラム ファイルを指します。大きなプログラム内に複数のプログラム ファイルが存在する場合があります。プログラム スコープを持つ変数は、すべてのファイル (変数が定義されているファイル内だけでなく)、関数、およびプログラム全体の他のブロック内で表示されます。詳細については。これを確認してください:Cのスコープとストレージクラス

于 2012-12-25T03:10:11.980 に答える