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

gev*_*ang 2 c++ namespaces std

据我所知rand(),作为示例函数<cstdlib>,存在于全局和std命名空间中.

实际上,以下将编译没有错误,即调用std::rand()rand()将是合法的.

#include <cstdlib>    
int main() {
    std::rand();
    rand();    
}
Run Code Online (Sandbox Code Playgroud)

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

Alo*_*ave 5

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


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

包含cstdlib并使用完全限定名称rand.

std::rand()
Run Code Online (Sandbox Code Playgroud)

参考文献:

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

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


好读:
我应该在C++程序中包含<xxxx.h>还是<cxxxx>?

  • 它不是实现定义的; 它没有具体说明.不同之处在于实现定义意味着需要实现来记录它的作用. (3认同)