假设我想从以下内容中获取名称字段的字节大小或字符大小:
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]))
offsetof
在这里没有帮助,因为它计算的是偏移量,而他需要的是大小(未指定的填充量使得从一个转换到另一个变得不可能)。 - Pavel Minaevrecord 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++代码中曾经使用过的编程构造,但我不得不想知道为什么在C++03中sizeof不能像这样工作?你递给它一个名称,它就给你大小。我本以为这需要一些努力才能使其不起作用。但这就是C++标准的奇妙之处 :-)
sizeof(record::name)
很可能会成为下一个C++版本(C++0x)中的一个新特性。目前它还不是标准,也没有被广泛应用。 - Adrian McCarthyp->f
是可以的,p->C::f
也是可以的,&C::f
也是可以的,但是单独的C::f
则不行。对于静态类成员或命名空间非类型成员,C::f
当然是一个合法的表达式,它评估为一个左值,并且任何表达式都可以是sizeof
的操作数。对于类型成员,C::T
是一个类型引用,在sizeof
上下文中也是合法的。C++0x在这里添加了第三个sizeof
类别。 - Pavel Minaevrecord
是一种类型的名称,但 record.name
不是。你需要通过结构体实例来访问 name 属性。Sorin 的答案是通常的 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.
可移植,完全安全,我认为明确指定原始数组长度是一个好习惯。
(编辑:如果编译器对变量数组长度感到不满意,您可能需要在C中进行宏定义。如果这样做,请考虑将静态const int定义为该宏的值!)
您可能想读一下this,因为它讨论了与本主题相同的问题,并提供了本帖中提到的所有选项以及更多的内容。
char
和byte
是同义词。 - pmg