【问题标题】:why and how does rand() exist both in global and std namespace in cstdlib?为什么以及如何在 cstdlib 的全局和 std 命名空间中存在 rand()?
【发布时间】:2013-02-08 20:30:33
【问题描述】:

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

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

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

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

【问题讨论】:

  • std::rand 是 C++ 标准库的一部分,而 rand 用于 ANSI C 兼容性。

标签: c++ namespaces std


【解决方案1】:

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


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

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

std::rand()

参考资料:

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

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


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

【讨论】:

  • 它没有定义实现;这是未指定的。不同之处在于实现定义意味着实现需要记录它的作用。
  • 感谢您的澄清。未指定的行为虽然回答了“何时”(即上述代码何时编译)。关于如何在两个命名空间中提供它们的任何想法,可能是这种情况,即通过相同的实现?
【解决方案2】:

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

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

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

【讨论】:

  • 关于 cstdlib 中函数的来源,是的。然而,这并不能回答双重命名空间转换的目的/细节。正如您还指出的那样,与 C++ 实现无关的行为的标准做法是 std::rand()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 2014-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多