我知道rand()
,作为来自 的示例函数<cstdlib>
,它同时存在于全局和std
命名空间中。
实际上,下面的代码编译不会出错,即调用std::rand()
和调用rand()
都是合法的。
#include <cstdlib>
int main() {
std::rand();
rand();
}
这个有什么用,它是如何实现的(函数在两个命名空间中)?
我知道rand()
,作为来自 的示例函数<cstdlib>
,它同时存在于全局和std
命名空间中。
实际上,下面的代码编译不会出错,即调用std::rand()
和调用rand()
都是合法的。
#include <cstdlib>
int main() {
std::rand();
rand();
}
这个有什么用,它是如何实现的(函数在两个命名空间中)?
该行为是根据标准指定的行为。
根据标准,包括在命名空间和可能在全局命名空间cstdlib
中导入符号名称。std
如果您依赖包含在全局命名空间中的符号名称,那么您的程序是不可移植的,并且您依赖于特定实现的行为。
要不依赖实施行为,您必须:
包含cstdlib
并使用rand
.
std::rand()
参考:
C++11 标准:D.5 C 标准库头文件
第 3 段:
[ 示例:标头
<cstdlib>
确实在命名空间中提供了它的声明和定义std
。它还可以在全局命名空间中提供这些名称。头文件<stdlib.h>
在全局命名空间中确实提供了相同的声明和定义,就像在 C 标准中一样。它还可以在命名空间内提供这些名称std
。—结束示例]
原因是它最初是一个 C 函数。它来自 C.
C++ 将这些 C 函数重新实现到 std 命名空间中。据我所知,没有区别,但建议 C++ 程序员使用 std:: 命名空间中的函数,首先包括“c”whatever 标头(这确实是您对“cstdlib”标头所做的事情)。
(顺便说一下,普通 C 程序员会包含“stdlib.h”头文件。)