rand的使用方法--C99版
How to use rand -- C99 version
我正在编写一个 C 程序,我想像这样使用 for
:
for(int i=0 ; i < something ; i++ )
所以我需要使用C99版本才能初始化 for里面的counter C99 版本不适用于 rand()
功能。
事实上,rand()
的手册页中提到:“该函数不是 C99 的一部分,而是 POSIX 的一部分”
为了避免在 for
之前初始化计数器的任何想法..
//更新
编译的输出是:
warning: implicit declaration of function ‘rand_r’ [-Wimplicit-function-declaration]
代码:
array[i] = rand_r(&seed) % MAX + MIN;
- > array[i]类型是char*(我已经动态分配了space)
谢谢
rand()
是 C99 标准的 大部分 部分,您只需确保包含正确的头文件即可。
#include <stdlib.h>
int main(void) {
return rand() % 10;
}
stdlib.h
头文件包含在C99标准的7.20
中,rand()
包含在7.20.2
.
中
如果您的手册页声明它不是 C99 的一部分,那么它是不正确的。我的(在 Debian Jessie 下)明确指出:
The functions rand() and srand() conform to SVr4, 4.3BSD, C89, C99, POSIX.1-2001.
但是,当然,控制文件是标准本身。
您可能误读了手册页,或者编写手册页的人可能会感到困惑。 random()
和 srandom()
函数不是 C99 的一部分(它们是 POSIX),但是 rand()
和 srand()
肯定是 是。
或者您可能正在使用 rand_r
,可重入版本。那也是 POSIX 但不是 C99。
如果你想在C99模式下使用gcc
来获得for (int i = 0...
的功能,但是仍然希望能够调用非C99的函数, 用 -std=gnu99
而不是 -std=c99
.
编译
使用 stdlib
库并添加以下代码。
#include <stdlib.h>
var_name =( rand() % 50);
恐怕你误会了几件事。
rand()
、rand_r()
和 random()
是三个不同的函数。
rand()
由 ISO C 标准指定,并在 <stdlib.h>
中声明。它包含在 C 标准的所有版本中(1990、1999 和 2011)。这意味着您可以依赖 任何 符合托管 C 实现来提供它(根据定义;任何不实现 rand()
的托管实现都是 non-conforming)。 (符合要求的独立实现不需要提供 rand()
,或者根本不需要任何库函数;此类实现通常用于嵌入式系统。)
rand_r()
不是ISO C标准规定的;相反,它由 POSIX 标准指定。 POSIX 在 ISO C 定义的基础上定义了许多库函数。事实上,C99 没有指定 rand_r()
而不是 意味着你不能在 C99 程序中使用 rand_r()
;它仅仅意味着你不能在 portable C99 程序中使用它。 (一个 100% 可移植的 C 程序不能依赖于 POSIX,因为不是所有的实现都支持 POSIX。)rand_r()
,像 rand()
,被声明(如果它被声明的话)在 <stdlib.h>
。您可能需要做一些额外的事情来启用 rand_r()
和其他 POSIX-specific 功能。对于 gcc,您可以通过 而不是 指定 -pedantic
,或者通过指定 -std=gnu99
(具有 GNU 扩展的 C99),或者通过添加
#define _POSIX_C_SOURCE 1
到源文件的顶部,在 #include <stdlib.h>
.
之前
rand_r()
类似于 rand()
,但它被设计为 thread-safe,因为它使用由调用者控制的种子而不是隐式静态分配的种子。
请注意,POSIX 标准表示 rand_r()
可能会从未来的 POSIX 标准中删除,可能是因为有更好的 pseudo-random 数字生成器。
random()
是另一个不同的函数。它类似于 rand()
,但更复杂一些。与 rand_r()
一样,random()
由 POSIX 定义,但不是由 ISO C 定义。如果您想使用 random()
,则需要考虑类似的注意事项。由于我不完全清楚的原因,您需要使用不同的符号(_SVID_SOURCE
而不是 _POSIX_C_SOURCE
)。至于任何功能,您应该阅读文档以了解确切的使用方法。
None 这与 C99 风格的 for
循环有关。 C90 不允许以下形式的循环:
for (int i = 0; i < N; i ++) { /* ... */ }
1999 年的标准(当然在 2011 年的标准中保留了该特性)已将此功能添加到该语言中。这是该语言的核心特性,与标准库无关。
要使用 C99 风格的 for
循环,您需要使用接受它们的编译器,可能带有 command-line 选项来告诉它使用 1999 标准或更高版本。
要使用 POSIX-specific 函数(或 any 库函数),您需要阅读特定函数的文档并按其说明操作,其中包括 #include
ing 定义它的 header,可能定义一些符号来启用它,并可能在调用编译器或链接器时添加额外的 command-line 选项。
我正在编写一个 C 程序,我想像这样使用 for
:
for(int i=0 ; i < something ; i++ )
所以我需要使用C99版本才能初始化 for里面的counter C99 版本不适用于 rand()
功能。
事实上,rand()
的手册页中提到:“该函数不是 C99 的一部分,而是 POSIX 的一部分”
为了避免在 for
之前初始化计数器的任何想法..
//更新
编译的输出是:
warning: implicit declaration of function ‘rand_r’ [-Wimplicit-function-declaration]
代码:
array[i] = rand_r(&seed) % MAX + MIN;
- > array[i]类型是char*(我已经动态分配了space)
谢谢
rand()
是 C99 标准的 大部分 部分,您只需确保包含正确的头文件即可。
#include <stdlib.h>
int main(void) {
return rand() % 10;
}
stdlib.h
头文件包含在C99标准的7.20
中,rand()
包含在7.20.2
.
如果您的手册页声明它不是 C99 的一部分,那么它是不正确的。我的(在 Debian Jessie 下)明确指出:
The functions rand() and srand() conform to SVr4, 4.3BSD, C89, C99, POSIX.1-2001.
但是,当然,控制文件是标准本身。
您可能误读了手册页,或者编写手册页的人可能会感到困惑。 random()
和 srandom()
函数不是 C99 的一部分(它们是 POSIX),但是 rand()
和 srand()
肯定是 是。
或者您可能正在使用 rand_r
,可重入版本。那也是 POSIX 但不是 C99。
如果你想在C99模式下使用gcc
来获得for (int i = 0...
的功能,但是仍然希望能够调用非C99的函数, 用 -std=gnu99
而不是 -std=c99
.
使用 stdlib
库并添加以下代码。
#include <stdlib.h>
var_name =( rand() % 50);
恐怕你误会了几件事。
rand()
、rand_r()
和 random()
是三个不同的函数。
rand()
由 ISO C 标准指定,并在 <stdlib.h>
中声明。它包含在 C 标准的所有版本中(1990、1999 和 2011)。这意味着您可以依赖 任何 符合托管 C 实现来提供它(根据定义;任何不实现 rand()
的托管实现都是 non-conforming)。 (符合要求的独立实现不需要提供 rand()
,或者根本不需要任何库函数;此类实现通常用于嵌入式系统。)
rand_r()
不是ISO C标准规定的;相反,它由 POSIX 标准指定。 POSIX 在 ISO C 定义的基础上定义了许多库函数。事实上,C99 没有指定 rand_r()
而不是 意味着你不能在 C99 程序中使用 rand_r()
;它仅仅意味着你不能在 portable C99 程序中使用它。 (一个 100% 可移植的 C 程序不能依赖于 POSIX,因为不是所有的实现都支持 POSIX。)rand_r()
,像 rand()
,被声明(如果它被声明的话)在 <stdlib.h>
。您可能需要做一些额外的事情来启用 rand_r()
和其他 POSIX-specific 功能。对于 gcc,您可以通过 而不是 指定 -pedantic
,或者通过指定 -std=gnu99
(具有 GNU 扩展的 C99),或者通过添加
#define _POSIX_C_SOURCE 1
到源文件的顶部,在 #include <stdlib.h>
.
rand_r()
类似于 rand()
,但它被设计为 thread-safe,因为它使用由调用者控制的种子而不是隐式静态分配的种子。
请注意,POSIX 标准表示 rand_r()
可能会从未来的 POSIX 标准中删除,可能是因为有更好的 pseudo-random 数字生成器。
random()
是另一个不同的函数。它类似于 rand()
,但更复杂一些。与 rand_r()
一样,random()
由 POSIX 定义,但不是由 ISO C 定义。如果您想使用 random()
,则需要考虑类似的注意事项。由于我不完全清楚的原因,您需要使用不同的符号(_SVID_SOURCE
而不是 _POSIX_C_SOURCE
)。至于任何功能,您应该阅读文档以了解确切的使用方法。
None 这与 C99 风格的 for
循环有关。 C90 不允许以下形式的循环:
for (int i = 0; i < N; i ++) { /* ... */ }
1999 年的标准(当然在 2011 年的标准中保留了该特性)已将此功能添加到该语言中。这是该语言的核心特性,与标准库无关。
要使用 C99 风格的 for
循环,您需要使用接受它们的编译器,可能带有 command-line 选项来告诉它使用 1999 标准或更高版本。
要使用 POSIX-specific 函数(或 any 库函数),您需要阅读特定函数的文档并按其说明操作,其中包括 #include
ing 定义它的 header,可能定义一些符号来启用它,并可能在调用编译器或链接器时添加额外的 command-line 选项。