Compilare il controllo del tempo esistenza di stdint.h
Domanda
Sto lavorando con l'eredità incorporato codice C che definisce l'uint8_t, uint16_t
tipi e uint32_t
in un file di intestazione utilizzando la parola chiave typedef
.
Per la discussione, diciamo il file typedefs.h
contiene queste definizioni.
Nel mio nuovo modulo sorgente C, includo stdint.h
. Includo anche altri file header che comprendono qualche typedefs.h
nella gerarchia. Come previsto, il compilatore si lamenta più simboli definiti.
Vorrei modificare il file legacy typedefs.h
in modo che dichiara solo i tipi di uint*_t
se uno stdint.h
non è incluso o meglio se i tipi uint*_t
non sono definiti.
La mia comprensione è che #ifndef
non può essere utilizzato in quanto typedef
non è una direttiva del preprocessore.
Quindi, come faccio a dire al compilatore di non definire la uint*_t
se già esistono (o se il stdint.h
è già incluso)?
Nota. Questo sarebbe stato facile se la specifica C definito di serie includono le definizioni di guardia per i file di intestazione
FWIW, io sto usando Green Hills compilatore, 4,24, per un processore ARM9.
Soluzione
Basta fissare l'intestazione legacy per includere sempre stdint.h
di ottenere questi tipi, rimuovere le definizioni duplicate, e fornire un drop-in di file stdint.h
per i sistemi rotti che la mancanza di esso.
Altri suggerimenti
I beleive che il stdint.h
dovrebbe essere definendo una macro per limiti dei tipi che esso definisce. Si dovrebbe essere in grado di testare per coloro che utilizzano un #ifdef
e simili.
#ifndef UINT32_MAX
typdef ... uint32_t;
#define UINT32_MAX ...
...
#endif
Modifica:. Utilizzato originariamente UINT32_MIN, ma come Jens Gustedt poited questa è quella combinazione di firmato / unsigned e min / max che non si verifica
Se siete su un sistema UNIX, allora si dovrebbe back-up di un passo e utilizzare un pacchetto di configurazione come autoconf (1) o automake (1). E 'progettato per problemi di manico come questo.