Was ist eine gemeinsame C / C ++ Makro die Größe eines Strukturelements zu bestimmen?

StackOverflow https://stackoverflow.com/questions/1400660

  •  05-07-2019
  •  | 
  •  

Frage

In C / C ++, wie bestimme ich die Größe der Membervariable auf eine Struktur, ohne dass ein Dummy-Variable dieses Strukturtypen definieren? Hier ist ein Beispiel dafür, wie es falsch zu tun, sondern zeigt die Absicht:

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

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

Als Referenz sollte dies sein, wie die Größe zu finden, ‚x‘, wenn Sie zuerst einen Dummy-Variable definieren:

myStruct_t dummyStructVar;

const size_t sizeof_MyStruct_x = sizeof(dummyStructVar.x);

Aber ich bin nur die Hoffnung ein Dummy-Variable erstellen zu vermeiden, dass die Größe von ‚x‘ zu erhalten. Ich denke, es ist ein cleverer Weg, 0 als myStruct_t zur Neufassung die Größe der Membervariable ‚x‘ zu finden, aber es ist schon lange genug, dass ich die Details vergessen habe, und kann nicht scheint eine gute Google-Suche auf diesem zu erhalten . Wissen Sie?

Danke!

War es hilfreich?

Lösung

In C ++ (das ist, was die Tags sagen), Ihr "Dummy-Variable" Code kann ersetzt werden durch:

sizeof myStruct_t().x;

Kein myStruct_t Objekt erstellt wird. Der Compiler kann nur den statischen Typen von sizeof des Operanden aus, es nicht den Ausdruck ausführen

Das funktioniert in C und in C ++ ist besser, weil es auch für Klassen ohne zugänglich no-args Konstruktor funktioniert:

sizeof ((myStruct_t *)0)->x

Andere Tipps

Ich verwende folgende Makro:

#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 behandelt 0 als Zeiger auf Ihre Struktur. Dies wird bei der Kompilierung aufgelöst, so dass es sicher.

Sie können ganz einfach tun

sizeof(myStruct().x)

Als sizeof Parameter nie ausgeführt wird, werden Sie nicht wirklich das Objekt erstellen.

Jedes dieser Programme funktionieren soll:

sizeof(myStruct_t().x;);

oder

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

oder

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

Da sizeof zur Compile-Zeit ausgewertet wird, nicht Zeit laufen, werden Sie kein Problem dereferencing einen NULL-Zeiger haben.

In C ++ 11, kann dies mit sizeof(myStruct_t::x) erfolgen. C ++ 11 fügt auch std :: declval , die hierfür verwendet werden können, (unter anderem):

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

Von meinem Dienstprogramm Makros Header:

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

aufgerufen etwa so:

FIELD_SIZE(myStruct_t, x);  
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top