在C / C ++中获取结构或联合成员的字节大小或字符大小?

时间:2009-12-10 16:25:27

标签: c++ c unicode sizeof

假设我想从名字字段获取字节大小或字符:

struct record
{
    int id;
    TCHAR name [50];
};

sizeof(record.name)不起作用。

6 个答案:

答案 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到宏的值!)