大変なことになってるのでメモ。
stdlib.hからコピペ
1 2 3 |
template <typename _CountofType, size_t _SizeOfArray> char (*__countof_helper(UNALIGNED _CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray]; #define _countof(_Array) sizeof(*__countof_helper(_Array)) |
これを調べるために実験
配列の参照をとる関数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
int aaa(int (&arr)[3]) { return 0; } int main() { int t[3]; int a = aaa(t); int t2[] = {1,2,3}; a = aaa(t2); // ここから全部エラー int t3[] = {0,1,2,3}; a = aaa(t3); int* t4; a = aaa(t4); int tt[11]; a = aaa(tt); return 0; } |
aaaはテンプレートにしても書ける。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
template<size_t N> int aaa(int (&arr)[N]) { return 0; } int main() { int t[3]; int a = aaa(t); int t2[] = {1,2,3}; a = aaa(t2); int t3[] = {0,1,2,3}; a = aaa(t3); int* t4; // a = aaa(t4); //これだけエラー int tt[11]; a = aaa(tt); return 0; } |
となると__countof_helperは_SizeOfArray個のchar配列のポインタを返す関数の宣言。
それをsizeof(*__countof_helper)とすれば、_SizeofArray個のchar配列を返す関数のサイズとなって配列の個数になる。