题
我正在使用定义类型的Legacy Embedded 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
已经包括在内)?
注意:如果C规范定义的标准包括标头文件的后卫定义,这将很容易。
FWIW,我使用的是4.24的Green Hills Compiler用于ARM9处理器。
解决方案
只需修复旧标题始终包括 stdint.h
要获取这些类型 stdint.h
对于缺乏它的破碎系统。
其他提示
我相信 stdint.h
还应定义一个宏,以定义其定义类型的限制。您应该能够测试使用 #ifdef
等等。
#ifndef UINT32_MAX
typdef ... uint32_t;
#define UINT32_MAX ...
...
#endif
编辑:最初使用的UINT32_MIN,但是当Jens Gustedt所符合的情况下,这是签名/无符号和最小/Max的一种组合。
如果您在UNIX系统上,则应备份步骤并使用AutoConf(1)或Automake(1)之类的配置软件包。它旨在处理这样的问题。
不隶属于 StackOverflow