繁体   English   中英

编译时检查stdint.h的存在

[英]Compile time checking existence of stdint.h

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

为了讨论,让我们说文件typedefs.h包含这些定义。

在我的新C源代码模块中,我包含了stdint.h 我还包括其他的头文件,其中包括typedefs.h层次结构中的某处。 正如所料,编译器抱怨多个已定义的符号。

我想修改遗留文件typedefs.h以便它只声明uint*_t类型,如果没有包含stdint.h或者如果未定义uint*_t类型则更好。

我的理解是#ifndef不能使用,因为typedef不是预处理器指令。

那么如果它们已经存在(或者如果已经包含了stdint.h ),如何告诉编译器不定义uint*_t

注意:如果C规范定义的标准包含头文件的保护定义,这将很容易。

FWIW,我正在使用Green Hills编译器4.24,用于ARM9处理器。

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

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

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

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

如果您使用的是UNIX系统,那么您应该备份一个步骤并使用配置包,如autoconf(1)或automake(1)。 它旨在处理这样的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM