代码之家  ›  专栏  ›  技术社区  ›  Matt Ball

什么是普通C/C++宏来确定结构成员的大小?

  •  4
  • Matt Ball  · 技术社区  · 16 年前

    在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重新定义为一个mystrut来帮助查找成员变量“x”的大小,但是它已经足够长了,我已经忘记了细节,而且似乎无法在谷歌上找到一个好的搜索结果。你知道吗?

    谢谢!

    6 回复  |  直到 13 年前
        1
  •  18
  •   Steve Jessop    15 年前

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

    sizeof myStruct_t().x;
    

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

    这在C中工作,C++中更好,因为它也适用于没有可访问的无ARGS构造函数的类:

    sizeof ((myStruct_t *)0)->x
    
        2
  •  11
  •   Dewfy    16 年前

    我正在使用以下宏:

    #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;
    }
    

    技巧是将0作为指向结构的指针。这是在编译时解决的,因此是安全的。

        3
  •  3
  •   Arkaitz Jimenez    16 年前

    你可以很容易做到

    sizeof(myStruct().x)
    

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

        4
  •  3
  •   pix0r    16 年前

    其中任何一个都应该有效:

    sizeof(myStruct_t().x;);
    

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

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

    因为 sizeof 是在编译时计算的,而不是在运行时计算的,取消对空指针的引用不会有问题。

        5
  •  1
  •   Mankarse    13 年前

    在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);
    
        6
  •  0
  •   Michael Burr    16 年前

    从我的实用程序宏标题:

    #define FIELD_SIZE(type, field) (sizeof(((type *)0)->field))
    

    调用方式如下:

    FIELD_SIZE(myStruct_t, x);