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.
开发者_C百科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.
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.
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.
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.
精彩评论