为什么rand()编译时不包含cstdlib或使用命名空间std?

时间:2016-03-10 07:21:02

标签: c++ visual-studio visual-c++

根据我正在阅读的书,rand()在C ++中需要#include <cstdlib> 但是,我能够编译以下代码,在Visual Studio 2015中使用rand()而不使用#include <cstdlib>using namespace std;
为什么这两个不需要编译?我应该包含cstdlib吗?

C ++代码:

#include <iostream>

int main()
{
    std::cout << rand() << std::endl;
}

3 个答案:

答案 0 :(得分:8)

有两个问题在起作用:

  1. 标准库头文件可能包含其他标准库头文件。因此iostream可能直接或间接包含cstdlib
  2. 允许使用C标准库等价物(例如cstdlib)的头文件将C标准库名称带入全局命名空间,即std命名空间之外(例如rand自从C ++ 11以来,这是正式允许的,并且之前在很大程度上被容忍了。

答案 1 :(得分:4)

iostream可能直接或间接包含cstdlib。这会在范围中显示std::rand()::rand()。你正在使用后者。

但是,如果您想使用cstdlib,那么您不应指望这一点并始终包含rand。在C++代码中不使用rand,有更好的方法可以生成随机数。

答案 2 :(得分:2)

您绝对应该使用相关的包含文件来代码中使用的内容。当您将编译器/库更新到新版本时,它可以免除意外。我认为在std::前添加rand比使用using namespace std;要好得多 - 但无论哪种方式,最好不要依赖它而不使用命名空间,尽管如此往往是它在大多数地方的工作方式,以允许C代码向后兼容。