我正在使用遗留嵌入式C代码,该代码使用uint8_t, uint16_t
关键字在头文件中定义类型uint32_t
和typedef
。
为了便于讨论,我们假设文件typedefs.h
包含这些定义。
在我的新C源模块中,我包含stdint.h
。我还包括其他头文件,其中包含typedefs.h
在层次结构中的某个位置。正如所料,编译器抱怨多个已定义的符号。
我想修改旧文件typedefs.h
,以便在uint*_t
未包含stdint.h
时声明uint*_t
类型,如果#ifndef
类型不包含typedef
类型更好定义
我的理解是uint*_t
无法使用,因为stdint.h
不是预处理程序指令。
那么,如果编译器已经存在(或者如果{{1}}已经包含在内),如何告诉编译器不定义{{1}}?
注意:如果C规范定义的标准包含头文件的保护定义,这将很容易。
FWIW,我正在使用Green Hills编译器4.24,用于ARM9处理器。
答案 0 :(得分:7)
我相信stdint.h
也应该为它定义的类型的限制定义一个宏。您应该能够测试那些使用#ifdef
之类的人。
#ifndef UINT32_MAX
typdef ... uint32_t;
#define UINT32_MAX ...
...
#endif
编辑:最初使用的是UINT32_MIN,但正如Jens Gustedt所说,这是一个没有签名/无符号和最小/最大的组合。
答案 1 :(得分:4)
只需修复旧版标头,始终包含stdint.h
即可获取这些类型,删除重复的定义,并为缺少该系统的已损坏系统提供插入文件stdint.h
。
答案 2 :(得分:0)
如果您使用的是UNIX系统,那么您应该备份一个步骤并使用配置包,如autoconf(1)或automake(1)。它旨在处理这样的问题。