为什么rand()函数可以在不包含cstdlib头文件或使用std命名空间的情况下编译?

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

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

1
您可以使用/showIncludes选项(在IDE的项目属性下的“C/C++ |高级|显示包含项”中)进行编译,以查看stdlib是如何被包含的。 - Michael Burr
@MichaelBurr 我现在明白了,在Visual Studio中的输出显示iostream包含了cstdlib。有没有办法知道哪些文件是直接包含的,哪些是间接包含的?我只是好奇。 - Jorge Luque
2
使用/showIncludes选项输出的缩进级别指示了哪个头文件包含了哪个其他头文件。例如,对于VS 2015 Update 1, <iostream>仅直接包含<istream> - 所有其他引入的头文件都是由istream或更深层次的头文件间接包含的。 - Michael Burr
3个回答

11

有两个问题需要解决:

  1. 标准库的头文件可能包含其他标准库的头文件。因此, iostream 可能会直接或间接地包含 cstdlib
  2. 具有C标准库等效物的头文件(例如cstdlib)可以将C标准库名称引入全局命名空间,即std 命名空间之外(例如rand)。自C++11以来,这是正式允许的,并且在此之前大多被容忍。

“直接或间接”是什么意思? - Jorge Luque
3
我的意思是例如 iostream 可能包含 utilityutility 可能包含 limitslimits 可能包含 cstdintcstdint 可能包含 cstdlib - juanchopanza

4
可能直接或间接包含 。这会将 std::rand() 和 ::rand() 引入范围。你正在使用后者。
但是,是的,如果你想使用 rand,你不应该依赖于此,而应始终包含 。在 C++ 代码中不要使用 rand,有更好的方法生成随机数。

::rand()е’Ңrand()жҳҜдёҖж ·зҡ„еҗ—пјҹиҝҷиў«и®ӨдёәжҳҜеңЁе…ЁеұҖе‘ҪеҗҚз©әй—ҙдёӯеҗ—пјҹ - Jorge Luque
2
是的,在你的情况下,::rand()rand 是相同的。 - Mohit Jain

2

在编写代码时,你应该使用与其相关的include文件。这可以避免在升级编译器或库到新版本时出现意外情况。我认为在rand前添加std::比使用using namespace std;更好,但无论哪种方式,都不要依赖于它没有命名空间的存在,虽然这往往是为了C代码的向后兼容而采用的方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接