【问题标题】:C89 determine size of int at preprocessor timeC89 在预处理器时确定 int 的大小
【发布时间】:2017-03-17 20:35:07
【问题描述】:

我想根据整数的大小有条件地编译代码,但我没有找到在预处理阶段确定整数大小的方法。

一个想法是使用INT_MAX 并将其与常量进行比较:

#if INT_MAX >= 9223372036854775807UL
    printf("64 bit\n");
#elif INT_MAX >= 2147483647UL
    printf("32 bit\n");
#else
    printf("16 bit\n");
#endif

但我认为不能保证UL 文字可以这么大。据我所知,ULL 在 C89 中不可用。

那么您对如何解决这个问题有什么建议吗?在某些标准头文件中是否有包含 int 大小的宏?

编辑:

不是this question 的副本,因为我实际上不需要通用 sizeof 并且我不想打印它。我只需要区分不同的整数大小以进行条件编译。

【问题讨论】:

  • 有趣的问题。在我完成的所有项目中,我都可以通过构建系统获得这些信息。例如,构建系统放入定义以提供诸如 ARM、INTEL、32 位或 64 位等信息。我可以去 #ifdef(SYSTEM_32BIT) 来确定它是否是 32 位等。但是,如果您想要一些独立于任何构建系统的代码(例如,可以去任何地方的共享库源代码),那么这将不起作用。您可以使用每个编译器的所有内置#defines 来解决这个问题,但这会非常乏味。你的想法可能没问题。但先检查小
  • 除了按照您提议的路线之外,没有其他方法可以做到这一点。事实上,在 C99 或 C11 中也没有其他方法。你说得对,预处理器不一定允许 2^63-1 。也许最好的方法是编译产生你需要的大小的代码?请注意,特定的编译器可能会以自己特定的方式提供信息(通常这意味着不同的编译器会以不同的方式提供信息,因此对可移植性没有太大帮助)。
  • 例如:首先检查 INT_MAX ==(无论是 16 位是什么 :-) ),然后您就不必担心某些系统上的 32 位常量太大
  • 为什么不检查sizeof(int)*CHAR_BIT
  • @LưuVĩnhPhúc:sizeof 在预处理期间未解决。

标签: c macros c-preprocessor conditional-compilation c89


【解决方案1】:

首先测试较小的值应该可以工作,因为预处理器对#if 语句使用快捷评估:

#if INT_MAX == 32767
    #error 16 bits
#elif INT_MAX == 2147483647
    #error 32 bits
#elif INT_MAX == 9223372036854775807
    #error 64 bits
#else
    #error "What kind of weird system are you on?"
#endif

【讨论】:

  • 我想我会选择这个并在其他情况下回退到 16 位。
  • @FSMaxB 我认为回退到 16 位是没有意义的。你已经测试过了,它没有通过。最好让代码明显失败,而不是创建可能不正确的代码。
  • @user694733 在我的情况下,我可能会侥幸逃脱,因为它不会破坏代码,只会在某些情况下使性能变得非常慢。我这样做的原因首先是为了防止在整数类型太小的情况下出现未定义的行为。
  • “else”的情况实际上不应该发生在任何健全的系统上。 INT_MAX 被指定(无论如何在 unix 上)是一个 #if-testable 数量,如果你遇到一个 int 大小不是 16、32 或 64 位的系统,我会感到惊讶(就像你一样)。跨度>
猜你喜欢
  • 2019-01-08
  • 2013-02-02
  • 2013-07-28
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 2016-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多