2

我知道rand(),作为来自 的示例函数<cstdlib>,它同时存在于全局和std命名空间中。

实际上,下面的代码编译不会出错,即调用std::rand()和调用rand()都是合法的。

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

这个有什么用,它是如何实现的(函数在两个命名空间中)?

4

2 回答 2

5

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


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

包含cstdlib并使用rand.

std::rand()

参考:

C++11 标准:D.5 C 标准库头文件
第 3 段:

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


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

于 2013-02-23T05:37:17.107 回答
2

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

C++ 将这些 C 函数重新实现到 std 命名空间中。据我所知,没有区别,但建议 C++ 程序员使用 std:: 命名空间中的函数,首先包括“c”whatever 标头(这确实是您对“cstdlib”标头所做的事情)。

(顺便说一下,普通 C 程序员会包含“stdlib.h”头文件。)

于 2013-02-23T05:38:28.640 回答