我正在处理遗留的嵌入式 C 代码,这些代码使用 typedef
关键字在头文件中定义类型 uint8_t、uint16_t
和 uint32_t
.
为了便于讨论,假设文件 typedefs.h
包含这些定义。
在我的新 C 源代码模块中,我包含了 stdint.h
。我还包括其他头文件,其中包括层次结构中某处的 typedefs.h
。正如预期的那样,编译器提示多个定义的符号。
我想修改遗留文件 typedefs.h
以便它只声明 uint*_t
类型,如果 stdint.h
如果未定义 uint*_t
类型,则不包含或更好。
我的理解是 #ifndef
不能使用,因为 typedef
不是预处理器指令。
那么,如果 uint*_t
已经存在(或者如果 stdint.h
已经包含),我该如何告诉编译器不要定义它们?
注意:如果 C 规范定义的标准包括头文件的保护定义,这将很容易。
FWIW,我正在为 ARM9 处理器使用 Green Hills 编译器 4.24。
最佳答案
我相信 stdint.h
也应该为它定义的类型的限制定义一个宏。您应该能够测试那些使用 #ifdef
等的人。
#ifndef UINT32_MAX
typdef ... uint32_t;
#define UINT32_MAX ...
...
#endif
编辑:最初使用 UINT32_MIN,但正如 Jens Gustedt 指出的那样,这是一种不会出现的有符号/无符号和最小值/最大值的组合。
关于编译时检查 stdint.h 是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3661576/