我理解rand()
作为<cstdlib>
的示例函数,存在于全局和std
命名空间中。
实际上,以下内容编译时没有错误,即对std::rand()
和rand()
的调用都是合法的。
#include <cstdlib>
int main() {
std::rand();
rand();
}
它的用途是什么以及它是如何实现的(函数在两个命名空间中)?
答案 0 :(得分:5)
根据标准,行为指定行为
根据包含cstdlib
的标准,在std
命名空间中导入符号名称,并且可能在Global名称空间中导入符号名称。如果您依赖于全局命名空间中包含的符号名称,那么您的程序是不可移植的,并且您依赖于特定实现的行为。
不要依赖于实施行为,你必须:
包括cstdlib
并使用rand
的完全限定名称。
std::rand()
参考文献:
C ++ 11标准:D.5 C标准库标题
第3段:
[示例:标题
<cstdlib>
确定在名称空间std
中提供其声明和定义。它还可以在全局命名空间中提供这些名称。标头<stdlib.h>
确实在全局命名空间中提供相同的声明和定义,就像在C标准中一样。它还可以在命名空间std
中提供这些名称。 - 例子]
答案 1 :(得分:2)
原因是它最初是一个C函数。它来自C。
C ++将这些C函数重新实现为std命名空间。我所知道的没有区别,但是建议C ++程序员在std :: namespace中使用该函数,首先包括“c”无论是什么标题(这是你用“cstdlib”标题完成的)。
(顺便说一句,普通C程序员会包含“stdlib.h”标题。)