代码之家  ›  专栏  ›  技术社区  ›  Greg D

我是否可以在不创建结构实例的情况下获取结构字段的大小?

  •  28
  • Greg D  · 技术社区  · 14 年前

    typedef struct Foo {
        int bar;
        bool baz;
    } Foo;
    
    // ...
    
    Foo s;
    StoreInSomething(s.bar, sizeof(s.bar)); // easy as pie
    

    现在我仍然可以这样做,但是使用我正在实现的接口(我得到一个BOOL,它指示位字段中特定位的状态应该是什么),我创建结构只是为了获得数据成员的大小。有没有一种方法可以告诉编译器应该使用结构域的大小而不创建结构实例?它在哲学上等同于:

    SetBit(bool val) {
        StoreInSomething(
            BITFIELD_POSITION_CONSTANT, // position of bit being set
            val,                        // true = 1, false = 0
            sizeof(Foo::bar));          // This is, of course, illegal.  (The method I've been told I must use req's the size of the target field.)
    }
    

    在堆栈上创建struct应该既快又便宜,但我怀疑我会在代码评审中对此感到不满,所以我正在寻找一种更好的方法,它不会带来额外的维护负担(比如#定义大小)。

    3 回复  |  直到 14 年前
        1
  •  46
  •   Martin Prikryl    4 年前

    可以使用以下表达式:

    sizeof Foo().bar
    

    作为 sizeof 不计算,只计算其类型,不实际创建临时。


    如果 Foo 如果不是默认可构造的(与您的示例不同),则必须使用不同的表达式,例如涉及指针的表达式。(感谢迈克·西摩)

    sizeof ((Foo*)0)->bar
    
        2
  •  11
  •   Björn Pollex    14 年前
    typedef struct Foo { 
        typedef BarType int;
        BarType bar; 
        bool baz; 
    } Foo;
    

    ...

    sizeof(Foo::BarType)
    
        3
  •  3
  •   John Rocha    14 年前

    #include <stdio.h>
    
    typedef struct Foo {
        char         cbar;
        short        sbar;
        int          bar;
        bool         baz;
        long long    llbar;
    } Foo;
    
    
    
    
    int main (void)
    {
        struct Foo    *p_foo = 0;
    
        printf("Size of cbar: %d\n", sizeof(p_foo->cbar));
        printf("Size of sbar: %d\n", sizeof(p_foo->sbar));
        printf("Size of bar: %d\n", sizeof(p_foo->bar));
        printf("Size of baz: %d\n", sizeof(p_foo->baz));
        printf("Size of llbar: %d\n", sizeof(p_foo->llbar));
    }
    

    163> size.exe
    Size of cbar: 1
    Size of sbar: 2
    Size of bar: 4
    Size of baz: 1
    Size of llbar: 8