Frage

Ich bin mit Legacy-Embedded-C-Code arbeiten, die die Typen uint8_t, uint16_t und uint32_t in einer Header-Datei Schlüsselwort mit der typedef definiert.

Für die Diskussion, lassen Sie uns sagen, dass die Datei typedefs.h diese Definitionen enthält.

In meinem neuen C-Source-Modul, I umfassen stdint.h. Ich auch andere Header-Dateien, die typedefs.h irgendwo in der Hierarchie enthalten. Wie erwartet, beschwert sich der Compiler über mehrere definierte Symbole.

Ich möchte die Legacy-Datei typedefs.h so modifizieren, dass sie nur die uint*_t Typen erklärt, wenn entweder stdint.h nicht enthalten ist, oder besser, wenn die uint*_t Typen sind nicht definiert.

Mein Verständnis ist, dass #ifndef nicht verwendet werden kann, da typedef kein Präprozessordirektive ist.

Wie kann ich feststellen, den Compiler nicht die uint*_t definieren, wenn sie bereits vorhanden sind (oder wenn die stdint.h ist bereits im Lieferumfang enthalten)?

. Hinweis: Dies wäre einfach, wenn die C-Spezifikation definierten Standard gehört guard Definitionen für die Header-Dateien

FWIW, ich bin mit Green Hills Compiler, 4.24, für einen ARM9-Prozessor.

War es hilfreich?

Lösung

fix einfach das Vermächtnis-Header immer stdint.h sind diese Arten zu erhalten, entfernen Sie die doppelten Definitionen und bieten eine Drop-in-Datei stdint.h für defekte Systeme, die es fehlt.

Andere Tipps

Ich glaube, dass der stdint.h sollte auch einen Makro für die Grenzen der Typen wird definiert, dass es definiert. Sie sollten für die zu Test Lage sein, ein #ifdef und dergleichen verwendet.

#ifndef UINT32_MAX
  typdef ... uint32_t;
  #define UINT32_MAX ...
  ...
#endif

Edit:. Ursprünglich verwendet UINT32_MIN, aber wie Jens Gustedt poited aus das ist die eine Kombination von mit / ohne Vorzeichen und min / max, die nicht auftritt

Wenn Sie auf einem UNIX-System sind, dann sollten Sie einen Schritt Back-up und verwenden Sie ein Konfigurationspaket wie autoconf (1) oder auto (1). Es wurde entwickelt, um Griff Probleme wie diese.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top