7

我正在使用旧的嵌入式 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,我正在为 ARM9 处理器使用 Green Hills 编译器 4.24。

4

3 回答 3

7

我相信它stdint.h也应该为它定义的类型的限制定义一个宏。您应该能够测试那些使用 a#ifdef等的人。

#ifndef UINT32_MAX
  typdef ... uint32_t;
  #define UINT32_MAX ...
  ...
#endif

编辑:最初使用 UINT32_MIN,但正如 Jens Gustedt 指出的那样,这是没有出现的有符号/无符号和最小/最大值的一种组合。

于 2010-09-07T18:45:58.007 回答
5

只需将遗留标头修复为始终包含stdint.h以获取这些类型,删除重复的定义,并为stdint.h缺少它的损坏系统提供一个插入文件。

于 2010-09-07T18:43:17.890 回答
0

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.

于 2010-09-07T20:21:08.867 回答