提问人:rith 提问时间:12/1/2022 更新时间:12/1/2022 访问量:102
random() 是什么时候在 C 语言中引入的,为什么标准 89 无法识别它?
When was random() introduced in C and why does standard 89 not recognise it?
问:
我正在做一个操作系统项目,要求是使用 C89 和迂腐的标志。
由于我在 macOS 上,因此在一些练习中,我遇到了相当多的功能问题。事实上,它的 macOS 手册页称其为“坏数字生成器”。因此,为了避免出现问题,我已改用 .现在,由于我正在使用 、 和 进行编译,因此由于有关于 的隐式声明的警告,它拒绝正常运行。如果我删除 ,它确实会生成警告,但它会编译(如预期的那样),但更有趣的是,它工作得很好。它按预期生成一个数字。我做错了什么?C89支持与否?我应该包括什么才能使警告消失?手册页只提及了哪些内容。rand()
random()
-std=c89
-pedantic
wall
werror
random()
werror
random
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
答:
两者都不是 C 标准的一部分。它们是 POSIX 函数,所以编译
with 在编译时不会提供他们的原型。random
srandom
-std=c89
您可以在源文件的顶部定义以下内容之一,以使其原型可用:
#define _DEFAULT_SOURCE
或
#define _XOPEN_SOURCE 600
这将启用 POSIX 以及其他扩展。有关这些宏的详细信息,请查看功能测试宏。
评论
_GNU_SOURCE
C89 是否支持随机?
事实并非如此。
现在,由于我正在使用 -std=c89、-pedantic、wall 和 werror 进行编译,因此由于有关于 random() 隐式声明的警告,它拒绝正常运行。
这是因为当您进入严格符合模式时,编译器将不允许将非标准函数放在标准库中的极其愚蠢的做法。如公认的答案中所述 是否允许编译器将函数添加到标准标头? 一个符合要求的实现不允许喷出可能与应用程序冲突的标识符(“影响严格符合要求的程序的行为”)。
问题的根源是POSIX,这是一个与ISO 9899不协调的破碎标准。
评论
__STDC_NO_SYMBOLS_BEYOND
评论
random
并且不是 C 标准的一部分,尽管它们(我认为)在 POSIX 标准中。请尝试改用 和 (标准 C 函数)。srandom
rand
srand