C 中 INT_MAX 和 __INT_MAX__ 之间的区别

Tha*_*nos 50 c limit

2者有什么区别?__INT_MAX__据我所知,它是在没有添加库的情况下定义的,并且INT_MAX是在 中定义的limits.h,但是当我包含该库时,INT_MAX它会以__INT_MAX__任何一种方式扩展(或者 VSCode 是这么说的)。limits.h当它扩展到另一种时,为什么我还要使用它?

And*_*zel 59

您应该始终使用INT_MAX,因为这是 ISO C 标准定义的宏常量。

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


dbu*_*ush 43

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

另一方面,INT_MAX它是由 C 标准定义的,并且保证出现在limits.h任何符合标准的编译器中。

因此,为了可移植性,请使用INT_MAX.

  • @gnasher729:我认为 John Dallman 写了 __INT_MAX__ (带有前导和尾随下划线),但他的意思是“__INT_MAX__”(带有反引号)。 (7认同)
  • 我认为这更像是“像 ac 编译器一样工作”-) (4认同)
  • __test_with_leading_and_trailing_underscores__ (4认同)
  • Clang 还定义了 __INT_MAX__,作为其“与 GCC 非常相似”功能的一部分, (3认同)

And*_*nle 15

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

limits.h是标准的和便携式的。

C 语言的每个实现都可以自由地创建它认为合适的宏值INT_MAX。您看到的值__INT_MAX__是特定编译器的产物,甚至可能是您正在使用的编译器的特定版本。


Joh*_*man 11

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

我从事的数学建模工作最初是在 20 世纪 80 年代在VAX/VMS上编写的,早期支持多个 68000 个平台,包括Apollo/Domain。如今,它可以在 64 位 Windows、Linux、macOS、Android 和 iOS 上运行,而这些在它创建时都不存在。