2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

_countofというマクロについて

2
Last updated at Posted at 2025-11-10

本記事では 「_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は使えないようになっています。

2
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?