【问题标题】:Compile time checking existence of stdint.h编译时检查 stdint.h 是否存在
【发布时间】:2010-09-07 18:36:31
【问题描述】:

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

为了讨论,假设文件typedefs.h 包含这些定义。

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

我想修改旧文件 typedefs.h,使其仅在不包含 stdint.h 时声明 uint*_t 类型,如果未定义 uint*_t 类型则更好。

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

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

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

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

【问题讨论】:

    标签: c typedef uint32 stdint


    【解决方案1】:

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

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

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这是一个嵌入式系统,既不使用Unix也不使用Linux,而是使用ThreadX。此外,它是在 stdint.h 成为标准之前编码的。
      • @Thomas:您可能在 ThreadX 以外的操作系统(例如 Linux 或 Windows)上运行 Green Hills 编译器,对吧?很少有嵌入式编译器是自托管的。也就是说,在这种情况下,autoconf/automake 听起来有点矫枉过正,它们解决了一个不同的问题:“我如何让我的代码在多个平台上编译,无论它们是否有 stdint.h?”,而不是“我如何制作新的使用 stdint.h 的代码不再与定义某些相同类型的旧代码冲突了吗?”
      猜你喜欢
      • 1970-01-01
      • 2013-03-16
      • 2013-11-13
      • 1970-01-01
      • 2020-05-17
      • 2017-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多