为什么以及如何在cstdlib中的global和std命名空间中存在rand()?

时间:2013-02-23 05:33:57

标签: c++ namespaces std

我理解rand()作为<cstdlib>的示例函数,存在于全局和std命名空间中。

实际上,以下内容编译时没有错误,即对std::rand()rand()的调用都是合法的。

#include <cstdlib>    
int main() {
    std::rand();
    rand();    
}

它的用途是什么以及它是如何实现的(函数在两个命名空间中)?

2 个答案:

答案 0 :(得分:5)

根据标准,行为指定行为 根据包含cstdlib的标准,在std命名空间中导入符号名称,并且可能在Global名称空间中导入符号名称。如果您依赖于全局命名空间中包含的符号名称,那么您的程序是不可移植的,并且您依赖于特定实现的行为。


不要依赖于实施行为,你必须:

包括cstdlib并使用rand的完全限定名称。

std::rand()

参考文献:

C ++ 11标准:D.5 C标准库标题
第3段:

  

[示例:标题<cstdlib>确定在名称空间std中提供其声明和定义。它还可以在全局命名空间中提供这些名称。标头<stdlib.h>确实在全局命名空间中提供相同的声明和定义,就像在C标准中一样。它还可以在命名空间std中提供这些名称。 - 例子]


好读:
Should I include <xxxx.h> or <cxxxx> in C++ programs?

答案 1 :(得分:2)

原因是它最初是一个C函数。它来自C。

C ++将这些C函数重新实现为std命名空间。我所知道的没有区别,但是建议C ++程序员在std :: namespace中使用该函数,首先包括“c”无论是什么标题(这是你用“cstdlib”标题完成的)。

(顺便说一句,普通C程序员会包含“stdlib.h”标题。)