编译时检查 stdint.h 是否存在

标签 c typedef uint32 stdint

我正在处理遗留的嵌入式 C 代码,这些代码使用 typedef 关键字在头文件中定义类型 uint8_t、uint16_tuint32_t .

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

最佳答案

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

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

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

关于编译时检查 stdint.h 是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3661576/

相关文章:

c - 为什么 libxml2 在 C/C++ 代码中到处都使用 "BAD_CAST"?

c - POSIX 计时器以预期频率的两倍运行

c++ - C++ 中是否可以使用条件类型定义?

C 递归 typedef 结构

swift - 为什么随机生成的数字在 Swift 中默认为 UInt-32?

c# - 从字符串转换为UInt32-C#

c - 虽然循环不起作用

c++ - 如何为Winboard制作一个简单的协议(protocol)?

c - 为什么 'struct' 关键字必须在 C 中的结构实例之前?

string - 将 uint32 转换为字符串并添加前导 0