本記事では 「_countof」 というマクロについて軽く説明しています。
_countofとは?
_countofは、c++でよく使われる 「配列の要素数を数える」 ためのマクロである。
...と言われても分からないと思うので下記の例をお見せします。
//numbers には 5 個の要素がある
int numbers[] = { 1, 2, 3, 4, 5 };
int length = _countof(numbers);
//_countof(numbers) はその要素数「5」を返してくれる
length = 5
このような処理を行えるのが_Countofとなっております。
これと似たようなコードでよく使われる物で
int length = sizeof(numbers) / sizeof(numbers[0]);
sizeof(numbers) → 配列全体のバイト数
sizeof(numbers[0]) → 1要素分のバイト数
両者を割ると「要素数」が出る
この様なコードがありますが、このコードでは可読性が少し悪く、書く量も多いので面倒です。
そういった際に_countofは活躍します。
使える場面
・for文やwhile文で配列をループする際に配列数を求めたい場合
・配列のすべてをDeleteしたい場合
・配列の要素数をハードコード(例えば
for (int i = 0; i < 10; i++)
のように 10 を書く事)をせずに、自動で数えたい場合。
※ 注意点
_countof が使えるのは 固定長配列(スタック上に確保された配列) だけ
ポインタ には使えない
例:
int* p = new int[10];
int len = _countof(p); // ❌ エラー、pは配列じゃなくてポインタ
まとめ
_countof は 「配列の要素数」 を返す便利マクロ。
sizeof(arr) / sizeof(arr[0]) の安全&簡単バージョン。
配列専用 、ポインタ には使えない。
追記
2025/11/11
配列のポインタでは使えるのか?という質問があったのでそれについても記載しておきます。
まず結果から話しますと、配列のポインタは使えません。
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int* p = arr; // 配列の先頭ポインタ
std::cout << "_countof(arr) = " << _countof(arr) << std::endl;
std::cout << "_countof(p) = " << _countof(p) << std::endl;
return 0;
}
上記のようなコードを作ったとします。
すると結果は以下のようになります。
_countof(arr) = 5
_countof(p) = 1
なぜこうなるのかというと
arrは 「配列型」 で、pは 「ポインタ型」 だからです。
_countofは 「配列ではない型にはエラーや1を返す」 ようになっているので、配列のポインタには_countofは使えないようになっています。