記憶クラス指定子
記憶クラス指定子 auto
B言語時代のなごり
関数内でしか使わない変数宣言につかう
関数の呼び出しとともにメモリが確保され関数を抜けるときに自動的に解放される
普通はautoをわざわざ書かない
int main(void) {
auto int a; /* int a; と同じ */
auto char c = 'A'; /* char c = 'A'; と同じ */
int b; /* auto int b; と同じ */
long d; /* auto long d; と同じ */
return 0;
}
記憶クラス指定子 register
宣言した変数をレジスタと呼ばれる高速演算が可能な機能で優先的に使われる
(ただし実際にレジスタを使ってくれるかはコンパイラの気分次第)
仮引数の定義にも使える
#include <stdio.h>
int main(void) {
register int i;
register int sum = 0;
for (i = 0; i < 1000; ++i) {
sum += i;
}
return 0;
}
記憶クラス指定子 extern
他のソースファイルやライブラリで定義されている
関数や変数を使うときにその関数や変数の宣言につける
(外部ファイルに定義があるというキーワードである)
(最近のコンパイラは賢いのでexternを付けなくても自動判断してくれる)
foo.h
extern int value;
extern int hoge(int n);
foo.c
#include "foo.h"
extern int value = 100;
extern int hoge(int n) {
return n * n;
}
bar.c
#include <stdio.h>
#include "foo.h"
int main(void) {
printf("%d\n", value
); /* foo.c で定義した 100 が出力される */ printf("%d\n", hoge
(12)); /* foo.c で定義した hoge() が呼ばれる */ return 0;
}
記憶クラス指定子 static
使い方が2種類ある
- ケース1
- autoの逆で関数を抜けてもメモリが保持されて関数の呼び出しのたびに値を再利用できる
#include <stdio.h>
int counter(void) {
static int count = 0; /* 変数の初期化は1番最初に呼び出された時だけ、それ以降はされない */
return ++count;
}
int notcounter(void) {
int count = 0; /* 関数が呼び出されるたびに初期化される */
return ++count;
}
int main(void) {
/* staticの宣言のあるcounter() */
printf("%d\n", counter
()); /* 1 が返る */ printf("%d\n", counter
()); /* 2 が返る */ printf("%d\n", counter
()); /* 3 が返る (呼び出すたびに値が更新) */
/* staticの宣言のないnotcounter() */
printf("%d\n", notcounter
()); /* 1 が返る */ printf("%d\n", notcounter
()); /* 1 が返る */ printf("%d\n", notcounter
()); /* 1 が返る (何度呼び出しても同じ値) */
return 0;
}
- ケース2
- externのグローバル変数の逆で外部ソースファイルでは参照できない、そのソースファイル内でしか使うことが許されない変数にできる
#include <stdio.h>
static int value = 100; /* このファイルからしか参照できない変数 */
int main(void) {
return 0;
}
記憶クラス指定子 typedef
そのスコープ内で有効な新しい型名を定義するらしい
struct pointxy {
int x;
int y;
};
typedef struct pointxy POINT;
typedef int * intP;
intP a, b, c; /* a,b,cは全部 int* 型で宣言される */
POINT f, g, h; /* f,g,hは全部 struct pointxy 型で宣言される */
最終更新:2013年10月27日 22:31