【问题标题】:What is a common C/C++ macro to determine the size of a structure member?确定结构成员大小的常用 C/C++ 宏是什么?
【发布时间】:2009-09-09 16:18:21
【问题描述】:

在 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


    【解决方案1】:

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

    sizeof myStruct_t().x;
    

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

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

    sizeof ((myStruct_t *)0)->x
    

    【讨论】:

    • 酷!这在 C++ 中对我有用。有没有办法在 C 中做到这一点?
    • 那么 C 呢?我不需要这个,但我真的很想知道:-)
    • 显然,第一种方法只适用于具有可访问默认构造函数(隐式或显式)的结构。第二个是通用的,可以在 C 和 C++ 中工作。
    • 顺便说一下,sizeof(myStruct_t::x) 将在 c++0x 中工作(来源维基百科)
    • @Pavel:很好,我的第一个 sn-p 真的只是让“虚拟变量”代码工作而不执行构造函数。 @Lucas,这个问题确实要求提供一个宏,所以我不怪那些提供宏的人。但提问者听起来很聪明,我可以处理这部分。
    【解决方案2】:

    我正在使用以下宏:

    #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 视为指向您的结构的指针。这是在编译时解决的,因此很安全。

    【讨论】:

    • 好!这就是我要找的宏!
    【解决方案3】:

    你可以轻松做到

    sizeof(myStruct().x)
    

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

    【讨论】:

      【解决方案4】:

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

      sizeof(myStruct_t().x;);
      

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

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

      因为sizeof 是在编译时而非运行时评估的,所以取消引用 NULL 指针不会有问题。

      【讨论】:

        【解决方案5】:

        在 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】:

          来自我的实用程序宏标题:

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

          像这样调用:

          FIELD_SIZE(myStruct_t, x);  
          

          【讨论】:

            猜你喜欢
            • 2011-03-23
            • 1970-01-01
            • 1970-01-01
            • 2014-08-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-02-11
            • 2020-08-08
            相关资源
            最近更新 更多