gpt4 book ai didi

c - random() 是什么时候在 C 中引入的?为什么标准 89 不识别它?

转载 作者:行者123 更新时间:2023-12-02 01:26:06 26 4
gpt4 key购买 nike

我正在开发一个操作系统项目,要求使用 C89 和迂腐的标志。

自从我使用 macOS 以来,我在一些练习中遇到了 rand() 函数的大量问题。事实上,它的 macOS 手册页将其称为“错误数字生成器”。因此,为了避免出现问题,我转而使用random()。现在,由于我使用 -std=c89-pedanticwallwerror 进行编译,因此它拒绝由于出现有关 random() 隐式声明的警告,因此可以正确运行。如果我删除 werror,它确实会生成警告,但它会编译(如预期),但更有趣的是,它工作得很好。它会按预期生成一个数字。我究竟做错了什么? C89 是否支持随机?我应该添加什么才能使警告消失?手册页只提到了包含的 stdlib.h

手册页提到的一个可行的替代方案是 arc4random(),但我很确定它不存在跨平台。

我的测试片段是

#include <stdio.h>
#include <stdlib.h>

int main()
{
int test;
srandom(5);

test = random() % 190;
printf("Hello World %d\n", test);

return 0;

}

它会生成以下输出:

main.c:15:5: warning: implicit declaration of function ‘srandom’; did you mean ‘srand’? [-Wimplicit-function-declaration]
15 | srandom(5);
| ^~~~~~~
| srand
main.c:17:12: warning: implicit declaration of function ‘random’; did you mean ‘rand’? [-Wimplicit-function-declaration]
17 | test = random() % 190;
| ^~~~~~
| rand
Hello World 115

最佳答案

randomsrandom 都不属于 C 标准的一部分。它们是 POSIX 函数,因此编译with -std=c89 在编译时不会使它们的原型(prototype)可用。

您可以在源文件顶部定义以下内容之一以使其原型(prototype)可用:

#define _DEFAULT_SOURCE

#define _XOPEN_SOURCE 600

这将启用 POSIX 以及其他扩展。查看feature test macros有关这些宏的详细信息。

关于c - random() 是什么时候在 C 中引入的?为什么标准 89 不识别它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74642518/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com