我正在使用定义类型的Legacy Embedded C代码 uint8_t, uint16_tuint32_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)之类的配置软件包。它旨在处理这样的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top