2010-09-15 14 views
25

To banalne, aby uzyskać rozmiar pola struct w C++, jeśli masz instancję struktury. Na przykład. (Nieskompilowany):Czy mogę uzyskać rozmiar pola strukturalnego bez tworzenia instancji struktury?

typedef struct Foo { 
    int bar; 
    bool baz; 
} Foo; 

// ... 

Foo s; 
StoreInSomething(s.bar, sizeof(s.bar)); // easy as pie 

Teraz mogę jeszcze zrobić coś takiego, ale z interfejsem mam wykonawczego (dostaję BOOL, który wskazuje, jaki jest stan określonego bitu w bitfield powinno być), I d będzie tworzyć strukturę wyłącznie w celu uzyskania rozmiaru elementu danych. Czy istnieje sposób wskazania kompilatorowi, że powinien on używać rozmiaru pola struct bez tworzenia instancji struktury? Byłoby filozoficzny odpowiednik:

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.) 
} 

Tworzenie struct na stosie powinny być szybkie i tanie, ale podejrzewam, że będę się za nią w dinged przeglądu kodu, więc szukam lepszy sposób, który nie wprowadza dodatkowego obciążenia konserwacyjnego (takiego jak #defines dla rozmiarów).

Odpowiedz

34

Można użyć wyrażenia takie jak:

sizeof Foo().bar 

Jako argument sizeof nie jest oceniana, tylko jego rodzaj, nie jest faktycznie tymczasowy stworzony.

Edit

Jeśli Foo nie została domyślnie konstruowalnych (w przeciwieństwie do swojej przykład), trzeba by użyć innego wyrażenia takie jak jeden z udziałem wskaźnika. (Podziękowania dla Mike'a Seymoura)

sizeof ((Foo*)0)->bar 
+0

interesujące. Zdając sobie sprawę, że OP pyta o C++, czy istnieje sposób na to, że działa również w C? –

+5

Tak długo, jak 'Foo' jest domyślnie skonstruowane. W przeciwnym razie będziesz potrzebował trochę fałszywych argumentów konstruktora lub 'sizeof ((Foo *) 0) -> bar'. @Dan: Wersja wskaźnika działa również w języku C. –

+1

+1: mój mózg właśnie eksplodował –

5
typedef struct Foo { 
    typedef BarType int; 
    BarType bar; 
    bool baz; 
} Foo; 

...

sizeof(Foo::BarType) 
2

Możesz użyć sizeof of z wskaźnikiem do struktury. Rozważmy coś jak następuje:

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

co daje rezultaty takie jak:

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