3

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

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

sizeof(record.name)不起作用。

4

6 回答 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]))

于 2009-12-10T16:29:52.287 回答
7

如果您先创建一个实例,它将起作用。

record r;
sizeof(r.name);
于 2009-12-10T16:36:56.453 回答
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++ 代码中使用过的编程结构,但我想知道为什么 sizeof 在 C++03 中不能以这种方式工作?你给它一个名字,它就会给你尺寸。我原以为它需要一些努力才能让它不起作用。但这就是 C++ 标准的奇妙之处 :-)

于 2009-12-10T16:29:23.067 回答
2

record是类型的名称,但record.name不是。您必须以某种方式通过结构的实例访问名称。索林的回答是通常的 C 解决方案:

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

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

于 2009-12-10T16:50:52.823 回答
1

您可能想阅读这篇文章,因为它讨论了相同的问题并提供了该线程中提到的所有选项,以及更多内容。

于 2009-12-10T17:02:05.850 回答
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 定义为宏的值!)

于 2009-12-10T21:48:20.883 回答