Kompilierzeit Überprüfung Existenz stdint.h
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.
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.