C 中 INT_MAX 和 __INT_MAX__ 的区别

问题描述 投票:0回答:7

这2者有什么区别?据我所知,

__INT_MAX__
是在不添加库的情况下定义的,
INT_MAX
是在
limits.h
中定义的,但是当我包含库时,
INT_MAX
会以任何方式扩展为
__INT_MAX__
(或者VSCode是这么说的)。当它扩展到另一个时,为什么我还要使用
limits.h
呢?

c
7个回答
60
投票

您应该始终使用

INT_MAX
,因为这是 ISO C 标准定义的宏常量。

宏常量

__INT_MAX__
未由 ISO C 指定,因此如果您希望代码可移植,则不应使用它。该宏只是您正在使用的编译器的实现细节。其他编译器可能不会定义该宏,并会以其他方式实现
INT_MAX


44
投票

__INT_MAX__
是一个实现定义的宏,这意味着并非所有系统都可能拥有它。 特别是,GCC 定义了这个宏,但 MSVC 没有。

另一方面,

INT_MAX
是由C标准定义的,并且对于任何符合标准的编译器都保证出现在
limits.h
中。

因此,为了便于携带,请使用

INT_MAX


15
投票

当 limit.h 扩展到另一个时,为什么我还要使用它?

limits.h
是标准且便携。

C 语言的每个实现都可以自由地创建它认为合适的宏值,例如

INT_MAX
。 您看到的
__INT_MAX__
值是您的特定编译器的产物,甚至可能是您正在使用的编译器的特定版本。


11
投票

补充其他答案,当您编写将在多个平台上运行的代码时,坚持标准确实是值得的。如果不这样做,当新平台出现时,您需要做很多工作来适应它,而最好的方法通常是更改它以使其符合标准。这项工作非常枯燥无味,非常值得通过从一开始就做正确的事情来避免。 我正在开发一个数学建模器,该模型最初于 20 世纪 80 年代在

VAX/VMS

上编写,早期支持多个 68000 个平台,包括 Apollo/Domain。如今,它可以在 64 位 Windows、Linux、macOS、Android 和 iOS 上运行,而这些在创建时都不存在


1
投票
是C预处理器中预定义的宏,用于指定特定平台上int类型的最大值。该值是实现定义的,并且在不同平台上可能会有所不同。

INT_MAX

是limits.h头文件中定义的常量,用于指定int类型的最大值。其定义如下:

define INT_MAX __INT_MAX__

limits.h头文件是C标准库的一部分,提供了指定各种类型限制的各种常量,例如int、long和long long类型的最小值和最大值。
之所以将

INT_MAX

定义为

__INT_MAX__

,是因为
__INT_MAX__
是一个预定义的宏,用于指定特定平台上int类型的最大值,而INT_MAX只是该值的别名。
您可以使用 
__INT_MAX__

INT_MAX

 来获取 int 类型的最大值,但通常建议使用 
INT_MAX
,因为它是在标准库头文件中定义的,因此更可移植。

在C编程语言中,

1
投票
是一个宏,它扩展为int类型变量可以存储的最大值。该值是实现定义的,这意味着它可能会根据所使用的特定 C 实现而变化。在大多数系统上,int 是 32 位数据类型,

INT_MAX

 定义为 2147483647,这是可以存储在 32 位二进制补码整数中的最大值。
另一方面,
__INT_MAX__

是一个预定义的宏,表示在编译C程序的系统上可以存储在int类型变量中的最大值。与

INT_MAX

 一样,
__INT_MAX__
 的值是实现定义的,并且可能会根据所使用的特定 C 实现而变化。但是,
__INT_MAX__
是由编译器在编译期间设置的,而
INT_MAX
通常在头文件中定义(例如,
limits.h
)并在运行时包含在程序中。
一般来说,建议在 C 程序中使用 INT_MAX

而不是

__INT_MAX__

,因为 
INT_MAX
 是可移植的并且可以在任何系统上工作,而 
__INT_MAX__
 特定于正在编译程序的系统。 

INT_MAX 是一个宏,指定整型变量不能存储超出此限制的任何值。

-1
投票
INT_MIN 指定整数变量不能存储低于此限制的任何值。

INT_MAX 和 INT_MIN 的值可能会有所不同 从编译器到编译器。以下是 编译器中的典型值,其中整数 使用 32 位存储。

INT_MAX 的值为+2147483647。 INT_MIN 的值为-2147483648。

© www.soinside.com 2019 - 2024. All rights reserved.