記憶クラス指定子に関するメモ
記憶クラス指定子には
extern、static、auto、typedef、register の5種類ある
- extern
- 関数やグローバル変数の外部利用宣言定義
- static
- 関数内で使うと変数の再利用宣言、グローバル変数定義で使うと変数のスコープをソースファイル内に限定する
- auto
- 関数内の一時変数を定義する際に使うが、省略可能で普通は省略して使う(通常の変数定義である)
- typedef
- 新しい型名を定義する、スコープ内で有効
- register
- 定義した変数を特定のレジスタに専用として割り当てて処理を高速化する(実際に割り当てるかはコンパイラが判断する)
#include <stdio.h>
static int value1; /* このソースファイル内でのみ使える大局変数の宣言 */
extern int value2; /* このソースファイル以外でも共通で使えるグローバル変数の宣言 */
extern int value2 = 100; /* グローバル変数の定義は変数を使うどれかのファイルの1か所だけで行う */
typedef int * intP; /* このソースファイル内では intP型という型が使える(実体は int* 型) */
int counter(void) {
static int count = 0; /* 初期化は呼び出された最初に行われるがそれ以降は最後の値を保持する */
return ++count;
}
int hoge(register int n) { /* 仮引数の定義にもregister は使える */
register int sum = 0;
for ( ; n > 0; --n) {
sum += n;
}
return sum;
}
int main(void) {
auto int a = 0; /* int a = 0; と同じ */
int b = 0; /* auto int b = 0; と同じ、通常はこのようにautoを省略して使う */
register int i; /* i をレジスタで使うよう定義 */
typedef long * longP; /* main関数内で有効な型名になる */
intP x, y; /* x,yともにintP型(int*型)として宣言される */
int * w, z; /* この宣言だと wだけint*型になり、zはint型になる */
printf("%d\n", counter
()); /* 1 が表示される */ printf("%d\n", counter
()); /* 2 が表示される */ printf("%d\n", counter
()); /* 3 が表示される、このように最後の値が保持される */
return 0;
}
.
最終更新:2013年10月28日 02:07