Saturday, September 1, 2018

C - ストレージクラス

記憶域クラスは、Cプログラム内の変数および/または関数の有効範囲(可視性)および有効期間を定義します。 それらは、変更するタイプに先行します。 Cプログラムには4つの異なるストレージクラスがあります。
- auto
- register
- static
- extern

「自動」ストレージクラス
'auto'ストレージクラスは、すべてのローカル変数のデフォルトのストレージクラスです。
{
   int mount;
   auto int month;
}

上記の例では、同じストレージクラスに2つの変数が定義されています。 'auto'は関数、すなわちローカル変数内でのみ使用できます。

'register'ストレージクラス

レジスタ記憶クラスは、RAMではなくレジスタに格納されるローカル変数を定義するために使用されます。 これは、変数がレジスタサイズ(通常は1ワード)に等しい最大サイズを持ち、(メモリ位置を持たないため)単項の '&'演算子をそれに適用できないことを意味します。
{
   register int  miles;
}
レジスタは、カウンタなどのクイックアクセスを必要とする変数にのみ使用する必要があります。 'register'を定義しても変数がレジスタに格納されるわけではありません。 これは、ハードウェアと実装の制限に応じてレジスタに格納することを意味します。


「静的な」ストレージクラス
静的記憶域クラスは、スコープを出入りするたびに作成および破棄するのではなく、プログラムの存続期間中にローカル変数を保持するようにコンパイラーに指示します。 したがって、ローカル変数を静的にすることで、関数呼び出し間で値を維持することができます。

静的修飾子はグローバル変数にも適用できます。 これが完了すると、変数のスコープが宣言されているファイルに制限されます。


Cプログラミングでは、グローバル変数でstaticが使用されると、クラスのすべてのオブジェクトによってそのメンバーのコピーが1つだけ共有されます。
#include <stdio.h>
 
/* function declaration */
void func(void);
 
static int count = 5; /* global variable */
 
main() {

   while(count--) {
      func();
   }
 
   return 0;
}

/* function definition */
void func( void ) {

   static int i = 5; /* local static variable */
   i++;

   printf("i is %d and count is %d\n", i, count);
}

上記のコードをコンパイルして実行すると、次の結果が生成されます。
i is 6 and count is 4
i is 7 and count is 3
i is 8 and count is 2
i is 9 and count is 1
i is 10 and count is 0


externストレージクラス

externストレージクラスは、すべてのプログラムファイルで参照可能なグローバル変数の参照を与えるために使用されます。 'extern'を使用すると、変数を初期化することはできませんが、事前に定義された格納場所に変数名をポイントします。

複数のファイルを持ち、グローバル変数または関数を定義すると、他のファイルでも使用されます。externは別のファイルで使用され、定義された変数または関数の参照を提供します。 理解のために、externは、グローバル変数または関数を別のファイルで宣言するために使用されています。

extern修飾子は、以下で説明する同じグローバル変数または関数を共有する複数のファイルがある場合に最もよく使用されます。


最初のファイル:main.c
#include <stdio.h>
 
int count ;
extern void write_extern();
 
main() {
   count = 5;
   write_extern();
}
2番目のファイル:support.c
#include <stdio.h>
 
extern int count;
 
void write_extern(void) {
   printf("count is %d\n", count);
}
ここでは、externは2番目のファイルのcountを宣言するために使用されています。最初のファイルmain.cに定義されています。 さて、これらの2つのファイルを次のようにコンパイルしてください。

$gcc main.c support.c

実行可能プログラムa.outが生成されます。 このプログラムを実行すると、次の結果が生成されます。
count is 5






No comments:

Post a Comment

Interfaces and their protocol stacks

インタフェースとそのプロトコルスタック 主要なネットワーク要素に精通した後、これら要素間のインタフェースをよりよく知る時期が来ています。 インタフェースは、MME、SGWおよびPGWが他のネットワーク要素(例えば、HSSまたはPCRF)と協働することを可能にする。 それらの...