www.mikrocontroller.net

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


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
struct stTest
{
  uint8_t array[100];
};
typedef struct stTest tstTest;

uint32_t  size=  sizeof(tstTest);
#if(size > 20)
  #error ätsch ... zu groß
#endif

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

Gruß Stefan

Autor: eszgd (Gast)
Datum:

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

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Silvan König (silvan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht so?:
#define SIZE 100

struct stTest
{
  uint8_t array[SIZE];
};
typedef struct stTest tstTest;

#if(SIZE > 20)
  #error ätsch ... zu groß
#endif

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zur Not kann man das auch unabhängig vom Compiler mit einem Trick 
machen:
#include <stdint.h>

struct stTest
{
  uint8_t array[100];
};
typedef struct stTest tstTest;

uint8_t array_ist_zu_gross[sizeof(tstTest) > 20 ? -1 : 1];

int main()
{
}

Bei diesem Programm gibt mir GCC z.B. aus:
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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Kasper (Gast)
Datum:

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

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

lg

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.