代码之家  ›  专栏  ›  技术社区  ›  Thomas Matthews

编译时检查stdint.h的存在性

  •  7
  • Thomas Matthews  · 技术社区  · 14 年前

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

    我们来讨论一下文件 typedefs.h 包含这些定义。

    在我的新C源模块中,我包括 stdint.h . 我还包括其他头文件,其中包括 字体类型 在等级制度中的某个地方。与预期的一样,编译器会抱怨多个定义的符号。

    我想修改旧文件 字体类型 所以它只声明 uint*_t 类型,如果 施蒂特 不包括在内,如果 尤因特 未定义类型。

    我的理解是 #ifndef 无法使用,因为 类型定义 不是预处理器指令。

    那么,如何告诉编译器不要定义 尤因特 如果它们已经存在(或者 施蒂特 是否已包括在内?

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

    fwiw,我使用GreenHills编译器4.24作为ARM9处理器。

    3 回复  |  直到 12 年前
        1
  •  4
  •   R.. GitHub STOP HELPING ICE    14 年前

    只需修复旧标题以始终包含 stdint.h 要获取这些类型,请删除重复的定义,并提供一个放置文件 施蒂特 对于缺乏它的破碎系统。

        2
  •  7
  •   torak    14 年前

    我认为 stdint.h 还应该为它定义的类型的限制定义宏。你应该能够测试那些使用 #ifdef 诸如此类。

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

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

        3
  •  0
  •   Steve Emmerson    14 年前

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

    推荐文章