在C/C++中如何获取结构体或联合体成员的字节数或字符数?

3

假设我想从以下内容中获取名称字段的字节大小或字符大小:

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

sizeof(record.name) 无法使用。


在C语言中,就尺寸而言,charbyte是同义词。 - pmg
6个回答

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]))


这并不一定是可移植的。在C语言中,您需要使用“offsetof”宏。如果您确实使用此形式,请阅读http://c-faq.com/struct/offsetof.html上的注释。 - Alok Singhal
@Alok:这确实不能保证可移植性,但是offsetof在这里没有帮助,因为它计算的是偏移量,而他需要的是大小(未指定的填充量使得从一个转换到另一个变得不可能)。 - Pavel Minaev
是的,我在发布了愚蠢的评论(以及对OP问题更愚蠢的回答)后很快意识到了这一点! - Alok Singhal

7
如果您先创建实例,它将正常工作。
record r;
sizeof(r.name);

1
至少,它是简单且便携的。 - stefaanv
1
抱歉,但这在C语言中不可能实现。 - sorin

4

在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++标准的奇妙之处 :-)


这段代码在VC++ 2008中无法编译通过:错误C2070:'': 非法的sizeof操作数。 - Brian R. Bondy
3
在 C++ 中,main() 函数不需要具有特定的返回值。 - anon
1
放弃Cygwin,转向MinGW是我的建议。 - anon
5
sizeof(record::name) 很可能会成为下一个C++版本(C++0x)中的一个新特性。目前它还不是标准,也没有被广泛应用。 - Adrian McCarthy
2
不,这里的问题并不在于资格本身,而是在C++03中,在成员访问或成员指针之外的任何上下文中引用非静态成员都是不合法的。因此,p->f是可以的,p->C::f也是可以的,&C::f也是可以的,但是单独的C::f则不行。对于静态类成员或命名空间非类型成员,C::f当然是一个合法的表达式,它评估为一个左值,并且任何表达式都可以是sizeof的操作数。对于类型成员,C::T是一个类型引用,在sizeof上下文中也是合法的。C++0x在这里添加了第三个sizeof类别。 - Pavel Minaev
显示剩余10条评论

2

record 是一种类型的名称,但 record.name 不是。你需要通过结构体实例来访问 name 属性。Sorin 的答案是通常的 C 语言解决方案:

sizeof ((struct record*)0)->name;

这会创建一个伪指针,指向struct record的实例(或伪实例的指针),然后访问name成员,并将该表达式传递给sizeof。它能够工作是因为sizeof不尝试评估指针表达式,只使用它来计算大小。

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.

可移植,完全安全,我认为明确指定原始数组长度是一个好习惯。

(编辑:如果编译器对变量数组长度感到不满意,您可能需要在C中进行宏定义。如果这样做,请考虑将静态const int定义为该宏的值!)


1

您可能想读一下this,因为它讨论了与本主题相同的问题,并提供了本帖中提到的所有选项以及更多的内容。


1
我可能会选择,也可能不会。也许你可以给一个提示,为什么我可能会选择前者。 - anon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接