マクロを定義し、配列のサイズを返し、入力されたパラメータが配列であるかどうかを確認します.


問題の説明:
通常、int a[100]のような配列を定義します.
それから別のコードを書いて、それからプログラムの知らないどの位置で、1つのaに伝わりました
彼は配列かもしれないと思いますが、確定していません.そして、aという配列の大きさも知りたいです.
通常sizeof(a)/sizeof(a[0])
しかし、このようにすると問題があり、aがオブジェクトであり、ちょうどaというオブジェクトが[]コロナアルゴリズムを再ロードした場合、この書き方はエラーを報告せず、このエラーを後ろに連れて行く.
そのため、このような問題を回避するための新しい方法が必要です.
解法:
#include<iostream>
using namespace std;

template <typename T, int N>
char (&ASN(T (&array)[N]))[N];
#define SIZEOF(array) sizeof(ASN(array))

int main()
{
        int a[100];
        cout<<SIZEOF(a)<<endl;
}

説明:
関数を宣言し、任意の配列の参照を入力し、charタイプの同じサイズの配列を出力します.関数は実装する必要はありません.
1、テンプレート技術を用いて、任意のタイプの配列をサポートする.
2、cの高度な宣言を使用して、配列参照の宣言を含んで、[]の優先度が&より高いことに注意して、だから(&array)は括弧で囲まなければなりません;
3、sizeofの特性を使用します.sizeofはオペレータであり、コンパイル期間中に実行されるため、関数宣言を与えるだけで実現しません.