【C言語】修飾子に関するキーワード
このページでは、C言語における修飾子に関するキーワードについて詳しく解説します。各項目のリンクをクリックすると、該当する説明にジャンプできます。
const
const
は、変数の値を変更できないことを示す修飾子です。
const int x = 10;
x = 20; // エラー:const変数は変更不可
また、ポインタと組み合わせることで、ポインタが指す値を変更不可にすることもできます。
const int *ptr = &x; // ptrが指す値は変更不可
int *const ptr2 = &x; // ptr2のアドレス自体が変更不可
volatile
volatile
は、変数がプログラムの外部要因で変更される可能性があることを示します。
volatile int flag;
while (flag == 0) {
// 他のスレッドや割り込みで flag が変わる可能性がある
}
コンパイラ最適化による意図しない動作を防ぐために使用されます。
restrict
restrict
はC99から導入された修飾子で、ポインタのエイリアス(別名アクセス)が発生しないことを保証します。
void copy(int *restrict dest, const int *restrict src, size_t n) {
for (size_t i = 0; i < n; i++) {
dest[i] = src[i];
}
}
この修飾子を使うことで、コンパイラが最適化しやすくなります。
inline
inline
は、関数のインライン展開を指示する修飾子です。
inline int square(int x) {
return x * x;
}
ただし、必ずインライン化されるわけではなく、コンパイラの判断に委ねられます。
static
static
は、変数や関数のスコープを制御する修飾子です。
1. 関数内で使用
関数内で宣言すると、変数は関数呼び出し間で値を保持します。
void counter() {
static int count = 0;
count++;
printf("%d\n", count);
}
2. グローバル変数で使用
グローバル変数に付けると、そのファイル内でのみ有効になります。
static int internalVar;
3. 関数に付ける
関数にstatic
を付けると、外部のファイルから参照できなくなります。
extern
extern
は、変数や関数が他のファイルに定義されていることを示します。
// file1.c
int sharedVar = 42;
// file2.c
extern int sharedVar;
register
register
は、変数をCPUのレジスタに配置することをコンパイラに指示します。
register int counter;
現在のコンパイラでは、ほとんど無視されることが多いです。
_Atomic
_Atomic
は、C11で導入された修飾子で、アトミック操作を保証します。
#include <stdatomic.h>
_Atomic int atomicCounter = 0;
マルチスレッド環境で安全に変数を更新できます。