假设我想从以下位置获取名称字段的字节或字符大小:
struct record
{
int id;
TCHAR name [50];
};
sizeof(record.name)
不起作用。
解决方案并不像您想象的那么漂亮:
size_in_byte = sizeof(((struct record *) 0)->name)
size_in_chars = _countof(((struct record *) 0)->name)
如果您想在 Windows 以外的其他平台上使用第二个,请尝试:
#define _countof(array) (sizeof(array)/sizeof(array[0]))
如果您先创建一个实例,它将起作用。
record r;
sizeof(r.name);
在 C++ 中:
#include <iostream>
using namespace std;;
struct record
{
int id;
char name [50];
};
int main() {
cout << sizeof( record::name) << endl;
}
编辑:有几个人指出这是 C++0x 代码,所以我想我必须收回我对 VC++ 的不友好评论。这不是我在自己的 C++ 代码中使用过的编程结构,但我想知道为什么 sizeof 在 C++03 中不能以这种方式工作?你给它一个名字,它就会给你尺寸。我原以为它需要一些努力才能让它不起作用。但这就是 C++ 标准的奇妙之处 :-)
record
是类型的名称,但record.name
不是。您必须以某种方式通过结构的实例访问名称。索林的回答是通常的 C 解决方案:
sizeof ((struct record*)0)->name;
这会创建一个指向 的实例(或指向伪实例的指针)的伪指针struct record
,然后访问该name
成员,并将该表达式传递给sizeof
。它之所以有效,是因为sizeof
它不尝试评估指针表达式,它只是使用它来计算大小。
您可能想阅读这篇文章,因为它讨论了相同的问题并提供了该线程中提到的所有选项,以及更多内容。
struct record
{
static const int kMaxNameChars=50;
int id;
TCHAR name [kMaxNameChars];
};
sizeof(TCHAR)*record::kMaxNameChars //"sizeof(record.name)"
//record::kMaxNameChars sufficient for many purposes.
便携、完全安全且 IMO 明确说明原始数组长度是一种很好的做法。
(编辑:如果编译器对可变数组长度感到不安,您可能必须在 C 中对其进行宏化。如果这样做,请考虑将静态 const int 定义为宏的值!)