编译时检查stdint.h的存在

时间:2010-09-07 18:36:31

标签: c typedef uint32 stdint

我正在使用遗留嵌入式C代码,该代码使用uint8_t, uint16_t关键字在头文件中定义类型uint32_ttypedef

为了便于讨论,我们假设文件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处理器。

3 个答案:

答案 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)。它旨在处理这样的问题。