Question

I'm working with legacy embedded C code which defines the types uint8_t, uint16_t and uint32_t in a header file using the typedef keyword.

For discussion, let us say the file typedefs.h contains these definitions.

In my new C source module, I include stdint.h. I also include other header files which include typedefs.h somewhere in the hierarchy. As expected, the compiler complains about multiple defined symbols.

I would like to modify the legacy file typedefs.h so that it only declares the uint*_t types if either stdint.h is not included or better if the uint*_t types are not defined.

My understanding is that #ifndef cannot be used since typedef is not a preprocessor directive.

So how do I tell the compiler to not define the uint*_t if they already exist (or if the stdint.h is already included)?

Note: this would be easy if the C specification defined standard include guard definitions for the header files.

FWIW, I am using Green Hills compiler, 4.24, for an ARM9 processor.

Was it helpful?

Solution

Just fix the legacy header to always include stdint.h to get these types, remove the duplicate definitions, and provide a drop-in file stdint.h for broken systems that lack it.

OTHER TIPS

I beleive that the stdint.h should also be defining a macro for the limits of the types that it defines. You should be able to test for those using a #ifdef and the like.

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

Edit: Originally used UINT32_MIN, but as Jens Gustedt poited out this is the one combination of signed/unsigned and min/max that doesn't occur.

If you're on a UNIX system, then you should back-up a step and use a configuration package like autoconf(1) or automake(1). It's designed to handle problems like this.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top