为什么random()在cstdlib中有效? (Ubuntu 10.10)

时间:2011-01-11 05:47:04

标签: c++ random overloading ambiguous

我一直认为cstdlib中的随机函数只是rand和srand,但是下面的工作(在Ubuntu 10.10上用g ++编译)?

我实际上在从Windows移动到Ubuntu时发现了这一点,我的编译失败了,因为它模糊地重载(我已经声明了我自己的'random()'函数)。

#include <cstdlib>
#include <iostream>

using namespace std;

int main() {
 srandom(50);
 cout << random();
 return 0;
};

此外,在Ubuntu上正确编译后,在检查stdlib.h之后会出现,其中,random()和srandom()等未在std命名空间中声明。这使得它成为一个完全痛苦的屁股......

#include <iostream>
#include <cstdlib>

int main() {
    std::cout << random();
    return 0;
};

2 个答案:

答案 0 :(得分:5)

random()Single Unix Specification的一部分。它不是C ++标准的一部分。这就是为什么它不在Windows上,而是在大多数Unix / Mac平台上都可以找到。

答案 1 :(得分:2)

因为编译器编写者可以自由地向语言库添加额外的东西,以使您的工作更轻松。通常,这不会是一个问题,因为它将它们放在一个你不会添加内容的命名空间中,std

你的问题来自那条小线

using namespace std;

这将所有std拉入程序的命名空间,包括编译器编写者有用提供的std::random。如果您明确声明从std提取的内容,则不会使用random来破坏您的本地std::random

using std::rand;
using std::srand;

另请参阅c ++ FAQ lite中的this question