【发布时间】: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