我正在撰写 C 计划,我希望像这样使用for
:
for(int i=0 ; i < something ; i++ )
因此,为了 初始化 的内部&#34; ()&#34;但 C99 版本不适用于rand()
功能。
实际上在rand()
的手册页中提及:&#34;该功能不是C99的一部分,而是POSIX&#34;
任何想法,以避免在for
..
// UPDATE
编译 的输出为:
warning: implicit declaration of function ‘rand_r’ [-Wimplicit-function-declaration]
代码:
array[i] = rand_r(&seed) % MAX + MIN;
由于
答案 0 :(得分:4)
rand()
非常很多是C99标准的一部分,您只需要确保包含正确的头文件。
#include <stdlib.h>
int main(void) {
return rand() % 10;
}
stdlib.h
标题文件包含在C99标准的7.20
中,rand()
涵盖了7.20.2
。
如果您的手册页说明它不属于C99,则说明不正确。我的(在Debian Jessie的领导下)明确指出:
函数rand()和srand()符合SVr4,4.3BSD,C89, C99 ,POSIX.1-2001。
但是,当然,它是控制文件的标准本身。
您可能误读了手册页,或者编写手册页的人可能会感到困惑。 random()
和srandom()
函数不属于C99(它们是POSIX),但rand()
和srand()
肯定是。< / p>
或者您可能正在使用可重入版本rand_r
。这也是POSIX而不是C99。
如果您想在C99模式下使用gcc
来获取for (int i = 0...
功能,但仍然希望能够调用非C99函数,请使用{{进行编译1}}而不是-std=gnu99
。
答案 1 :(得分:2)
我害怕你误解了几件事。
rand()
,rand_r()
和random()
是三个不同的功能。
rand()
由ISO C标准指定,并在<stdlib.h>
中声明。它包含在C标准的所有版本中(1990,1999和2011)。这意味着您可以依赖任何符合托管的C实现来提供它(根据定义;任何不实现rand()
的托管实现都是不符合的)。 (完全不需要提供独立实现来提供rand()
或任何库函数;这些实现通常用于嵌入式系统。)
rand_r()
;相反,它由POSIX标准指定。 POSIX在ISO C定义的基础上定义了许多库函数。 C99没有指定rand_r()
的事实不意味着您无法在C99程序中使用rand_r()
;它只是意味着您无法在便携式 C99程序中使用它。 (100%可移植的C程序不能依赖于POSIX,因为并非所有实现都支持POSIX。)rand_r()
,如rand()
,在{{1}中声明(如果它已经声明) }}。您可能需要执行额外的操作以启用<stdlib.h>
和其他POSIX特定的功能。对于gcc,您可以通过 not 指定rand_r()
,或指定-pedantic
(带有GNU扩展名的C99)或添加
-std=gnu99
到源文件的顶部,之前 #define _POSIX_C_SOURCE 1
。
#include <stdlib.h>
与rand_r()
类似,但它设计为线程安全的,因为它使用由调用者控制的种子而不是隐式静态分配的种子。
请注意,POSIX标准表示可能会从未来的POSIX标准中删除rand()
,可能是因为有更好的伪随机数生成器。
rand_r()
是另一个不同的功能。它就像random()
,但有点复杂。与rand()
类似,rand_r()
由POSIX定义,但不由ISO C定义。如果您想使用random()
,则类似的注意事项适用。由于我不完全清楚的原因,您需要使用不同的符号(random()
而不是_SVID_SOURCE
)。对于任何功能,您应该阅读文档以确切了解如何使用它。
这些都与C99风格的_POSIX_C_SOURCE
循环无关。 C90不允许使用以下形式的循环:
for
1999年标准(以及2011年标准中保留的cource)将该功能添加到该语言中。这是该语言的核心功能,与标准库无关。
要使用C99样式的for (int i = 0; i < N; i ++) { /* ... */ }
循环,您需要使用接受它们的编译器,可能使用命令行选项告诉它使用1999标准或更高版本。
要使用特定于POSIX的函数(或任何库函数),您需要阅读特定函数的文档并执行它所说的内容,其中包括for
标题定义它,可能定义一些符号来启用它,并可能在调用编译器或链接器时添加额外的命令行选项。
答案 2 :(得分:0)
使用stdlib
库并添加以下代码。
#include <stdlib.h>
var_name =( rand() % 50);