Forum: PC-Programmierung [C] Größe einer Struktur checken


von Stefan (Gast)


Lesenswert?

Hi.

Ich hoffe, dass ich das jetzt hier ins richtige Forum gesetzt habe.

Eigentlich habe ich eine einfache Frage, jedoch stellt sich das als 
großes Problem dar.
Ich will die beim Kompilieren die Größe einer Struktur checken, sodass 
sie eine bestimmte Größe nicht überschreitet. Tut sie es, so soll eine 
Warnung geworfen werden. Wie gesagt, eigentlich nichts dickes ... aber 
irgendwie klappt das nicht.

Meine Gedanken waren folgende:
1
struct stTest
2
{
3
  uint8_t array[100];
4
};
5
typedef struct stTest tstTest;
6
7
uint32_t  size=  sizeof(tstTest);
8
#if(size > 20)
9
  #error ätsch ... zu groß
10
#endif

Habt ihr einen anderen Ansatz? Über Anregungen wäre ich dankbar.

Gruß Stefan

von eszgd (Gast)


Lesenswert?

sizeof() und die Zuweisung werden erst zur Compilierzeit ausgewertet, 
den Präprozessor interessiert das nicht.

von Mario (Gast)


Lesenswert?

Praktisch ist das fast immer richtig, aber aufpassen! Seit C99 kann 
sizeof nicht mehr alles zur Compilezeit machen.

Diese einfachen Dinge, die seit Jahrzehnten gehen, laufen natürlich 
weiterhin in jeder relevanten Implementierung zur Compilezeit.

von Silvan K. (silvan) Benutzerseite


Lesenswert?

Vielleicht so?:
1
#define SIZE 100
2
3
struct stTest
4
{
5
  uint8_t array[SIZE];
6
};
7
typedef struct stTest tstTest;
8
9
#if(SIZE > 20)
10
  #error ätsch ... zu groß
11
#endif

von Arc N. (arc)


Lesenswert?

Stefan schrieb:
> Hi.
>
> Ich hoffe, dass ich das jetzt hier ins richtige Forum gesetzt habe.
>
> Eigentlich habe ich eine einfache Frage, jedoch stellt sich das als
> großes Problem dar.
> Ich will die beim Kompilieren die Größe einer Struktur checken, sodass
> sie eine bestimmte Größe nicht überschreitet. Tut sie es, so soll eine
> Warnung geworfen werden. Wie gesagt, eigentlich nichts dickes ... aber
> irgendwie klappt das nicht.
> Habt ihr einen anderen Ansatz? Über Anregungen wäre ich dankbar.
>
> Gruß Stefan

Welcher Compiler?
C++0x kennt für solche Zwecke static_assert
http://msdn.microsoft.com/en-us/library/dd293588.aspx

von Rolf Magnus (Gast)


Lesenswert?

Zur Not kann man das auch unabhängig vom Compiler mit einem Trick 
machen:
1
#include <stdint.h>
2
3
struct stTest
4
{
5
  uint8_t array[100];
6
};
7
typedef struct stTest tstTest;
8
9
uint8_t array_ist_zu_gross[sizeof(tstTest) > 20 ? -1 : 1];
10
11
int main()
12
{
13
}

Bei diesem Programm gibt mir GCC z.B. aus:
1
Stefan.c:9: Fehler: Größe des Feldes »array_ist_zu_gross« ist negativ

Die Meldung mag nicht ganz ideal sein, aber man erkennt den Grund.

von Stefan (Gast)


Lesenswert?

danke für eure antworten

@silvan
ganz so einfach ist es bei mir leider nicht. die befüllung der struktur 
übernimmt der anwender. und da ich 256 strukturen zur verfügung stelle, 
wird es scherig die defines der größen für alle zu pflegen.

@arc net
IAR C/C++ Compiler for AVR 5.40.1

@rolf
das ist echt nen guter trick. der könnte mir wirklich helfen. danke.

von Andreas Kasper (Gast)


Lesenswert?

Ich verwende Boost um die Größe beim Kompilieren zu prüfen:

http://www.boost.org/doc/libs/1_45_0/doc/html/boost_staticassert.html

lg

von Rolf Magnus (Gast)


Lesenswert?

Stefan schrieb:
> @arc net
> IAR C/C++ Compiler for AVR 5.40.1

Darf man fragen, warum du das dann unter "PC-Programmierung" postest?

von Stefan (Gast)


Lesenswert?

@rolf
weil das problem zu allgemein ist. in das µc-forum passte es meiner 
meinung nach syntaktisch nicht. da sollte es doch mehr um uart etc pp 
gehen.

damit ich es das nächste mal besser machen kann:
wo hätte es deiner meinung nach am besten gepasst?

gruß stefan

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.