假设我想从名字字段获取字节大小或字符:
struct record
{
int id;
TCHAR name [50];
};
sizeof(record.name)
不起作用。
答案 0 :(得分:8)
对此的解决方案并不像你想象的那么漂亮:
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]))
答案 1 :(得分:7)
如果您先创建一个实例,它将起作用。
record r;
sizeof(r.name);
答案 2 :(得分:5)
在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 ++标准的奇迹: - )
答案 3 :(得分:2)
record
是类型的名称,但record.name
不是。你不知何故必须通过struct的实例访问name。 Sorin的答案是通常的C解决方案:
sizeof ((struct record*)0)->name;
这将创建一个指向struct record
的实例(或指向伪实例的指针)的伪指针,然后访问name
成员,并将该表达式传递给sizeof
。它起作用,因为sizeof
不会尝试计算指针表达式,它只是用它来计算大小。
答案 4 :(得分:1)
您可能想阅读this,因为它讨论了同样的问题,并提供了此主题中提到的所有选项,以及更多内容。
答案 5 :(得分:1)
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到宏的值!)