【问题标题】:Why am I able to use INT_MIN without including <climits> header?为什么我可以在不包含 <climits> 标头的情况下使用 INT_MIN?
【发布时间】:2023-01-18 09:46:19
【问题描述】:

我编写了一个使用INT_MIN 的程序。但是,我没有使用 include 指令包含 &lt;climits&gt; 头文件。但是我的程序仍然可以编译,没有任何错误或警告。如何?编译器是否自动包含了这个头文件?

使用g++ 编译程序。

编辑:我只包含了 iostream 库。

【问题讨论】:

  • 你有没有包括其他标题?
  • iostream 将包含其他标头,这些标头将包含其他标头等。
  • 允许任何标准库包含任何其他标准库。但不要依赖于此,始终包括您使用的内容。
  • 题外话:但是不要在 C++ 中使用 INT_MIN,使用 std::numeric_limits<int>::min()。 INT_MIN 是一个宏,没有类型。
  • @VictorGubin 听起来像 FUD,你指的实际 C++ 编译器是什么? std::numeric_limits<int> 自 C++98 以来就存在。

标签: c++


【解决方案1】:

要举一个争议较小的例子,请考虑以下代码:

#include <iostream>
    
int main() {
    std::string s{"asd"};
    std::cout << s;
}

它在这里编译没有错误https://godbolt.org/z/fWbK4Yc5z

如果您使用std::string,您应该包括string。这并不意味着您可以在缺少 include 时依赖错误。标准库头文件可以包含其他头文件。这里碰巧 iostream 显然包含 string。这没什么可依赖的。它可能会随着编译器的下一个版本(我使用的是 gcc)而改变,并且它可能会在不同的编译器上中断。

(非官方)规则是:包括您使用的内容。如果您使用std::string,您应该包括string。如果您使用INT_MIN,您应该包括climits

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    相关资源
    最近更新 更多