“ sizeof”如何在此帮助程序中确定数组大小?

问题描述

| 我发现本文提供了以下模板和用于获取数组大小的宏:
template<typename Type,size_t Size>
char ( &ArraySizeHelper(Type( &Array )[Size]) )[Size];
#define _countof(Array) sizeof(ArraySizeHelper(Array))
我发现以下部分完全不清楚。
sizeof
应用于函数声明。我希望结果是“函数指针的大小”。为什么它获得“返回值的大小”呢?     

解决方法

template<typename Type,size_t Size>
char (&ArraySizeHelper(Type(&Array)[Size]))[Size];
#define _countof(Array) sizeof(ArraySizeHelper(Array))
  
sizeof
应用于函数声明。我希望结果是“函数指针的大小”。为什么它获得“返回值的大小”呢? 它不是
sizeof ArraySizeHelper
(这是非法的-不能接受
sizeof
一个函数),也不是
sizeof &ArraySizeHelper
-甚至不是隐式的,因为对于C ++,标准明确禁止从函数到指针到函数的隐式转换。 0x参见5.3.3)。相反,它是
sizeof ArraySizeHelper(Array)
,等于函数调用返回的值
sizeof
,即
sizeof char[Size]
,因此是
Size
。     ,
sizeof
应用于函数调用的结果,而不是声明。因此,它给出了返回值的大小,在这种情况下,该值是对chars数组的引用。 该模板使返回类型中的数组具有与参数数组相同数量的元素,该参数数组是从宏馈送到函数的。 最后,将“ 1”应用于对此char数组的引用。引用上的
sizeof
与类型本身上的
sizeof
相同。从ѭ15开始,给出数组中元素的数量。     ,
ArraySizeHelper
是一个函数模板,它返回大小为
Size
char
数组。模板有两个参数,一个是类型(is19ѭ),另一个是值(
Size
)。 因此,当您向函数传递类型为
A[100]
的对象时。编译器推导出模板的两个参数:
Type
变为
A
Size
变为
100
。 因此,实例化的函数返回类型变为
char[100]
。由于never1ѭ的参数从不求值,因此该函数无需定义。
sizeof
只需要知道函数的返回类型which26ѭ。这相当于
sizeof(char[100])
,它返回100-数组的大小。 要注意的另一个有趣点是,
sizeof(char)
与编译器无关,与其他原始类型(char1的变体除外)不同。它总是
1
。所以
sizeof(char[100])
保证是
100
。 1.
char
的所有变体的大小均为1,根据标准为
char
signed char
unsigned char
。