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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top