编译时检查stdint.h的存在

Tho*_*ews 7 c typedef uint32 stdint

我正在使用遗留嵌入式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,我正在使用Green Hills编译器4.24,用于ARM9处理器.

tor*_*rak 7

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

#ifndef UINT32_MAX
  typdef ... uint32_t;
  #define UINT32_MAX ...
  ...
#endif
Run Code Online (Sandbox Code Playgroud)

编辑:最初使用的是UINT32_MIN,但正如Jens Gustedt所说,这是一个没有签名/无符号和最小/最大的组合.


R..*_*R.. 5

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