在C / C ++中,如何确定结构的成员变量的大小,而无需定义该结构类型的虚拟变量?这是一个如何做错的例子,但显示了意图:

typedef struct myStruct {
  int x[10];
  int y;
} myStruct_t;

const size_t sizeof_MyStruct_x = sizeof(myStruct_t.x);  // error

作为参考,如果你首先定义一个虚拟变量,这应该是如何找到'x'的大小:

myStruct_t dummyStructVar;

const size_t sizeof_MyStruct_x = sizeof(dummyStructVar.x);

但是,我希望避免为了获得'x'的大小而创建一个虚拟变量。我认为有一种聪明的方法可以将0重新设置为myStruct_t,以帮助找到成员变量'x'的大小,但是我已经忘记了详细信息,并且似乎无法在此搜索。你知道吗?

谢谢!

有帮助吗?

解决方案

在C ++中(这是标签所说的),你的“虚拟变量”是代码可以替换为:

sizeof myStruct_t().x;

不会创建myStruct_t对象:编译器只能计算sizeof操作数的静态类型,它不会执行表达式。

这适用于C,在C ++中更好,因为它也适用于没有可访问的no-args构造函数的类:

sizeof ((myStruct_t *)0)->x

其他提示

我正在使用以下宏:

#include <iostream>
#define DIM_FIELD(struct_type, field) (sizeof( ((struct_type*)0)->field ))
int main()
{
    struct ABC
    {
        int a;
        char b;
        double c;
    };
    std::cout << "ABC::a=" << DIM_FIELD(ABC, a) 
              << " ABC::c=" << DIM_FIELD(ABC, c) << std::endl;

    return 0;
}

Trick将0视为指向结构的指针。这在编译时解决,因此安全。

你可以轻松做到

sizeof(myStruct().x)

由于从不执行sizeof参数,因此您不会真正创建该对象。

任何这些都应该有效:

sizeof(myStruct_t().x;);

myStruct_t *tempPtr = NULL;
sizeof(tempPtr->x)

sizeof(((myStruct_t *)NULL)->x);

因为 sizeof 是在编译时计算的,而不是运行时,所以解释引用NULL指针时不会有问题。

在C ++ 11中,可以使用 sizeof(myStruct_t :: x)来完成。 C ++ 11还添加了 std :: declval ,可用于此(除其他外):

#include <utility>
typedef struct myStruct {
  int x[10];
  int y;
} myStruct_t;

const std::size_t sizeof_MyStruct_x_normal = sizeof(myStruct_t::x);
const std::size_t sizeof_MyStruct_x_declval = sizeof(std::declval<myStruct_t>().x);

从我的实用程序宏标题:

#define FIELD_SIZE(type, field) (sizeof(((type *)0)->field))
像这样调用

FIELD_SIZE(myStruct_t, x);  
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top