random()是什么时候被引入C语言的?为什么标准89不能识别它?

llycmphe  于 2022-12-02  发布在  其他
关注(0)|答案(2)|浏览(177)

我正在做一个操作系统项目,要求使用C89和迂腐的标志。
由于我使用的是macOS,在几次练习中,我遇到了很多关于rand()函数的问题。实际上,它的macOS手册页称它为“坏数字生成器”。因此,为了避免它的问题,我改用了random()。现在,由于我使用-std=c89-pedanticwallwerror进行编译,它拒绝正确运行,因为有一个关于random()的隐式声明的警告。(如预期的)但是更有趣的是,它工作得很好。它生成了一个预期的数字。我做错了什么?C89是否支持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
wlzqhblo

wlzqhblo1#

randomsrandom都不是C标准的一部分。它们是POSIX函数,所以用-std=c89编译时,它们的原型并不可用。
您可以在原始程式档的顶端定义下列其中一项,以使其原型可用:

#define _DEFAULT_SOURCE

#define _XOPEN_SOURCE 600

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

r8uurelv

r8uurelv2#

C89是否支持随机?
它没有。
现在,由于我使用-std=c89、-pedantic、wall和werror进行编译,由于有一个关于random()隐式声明的警告,它拒绝正确运行。
这是因为当你进入严格符合模式时,编译器不允许将非标准函数放入标准库的愚蠢做法。正如Is a compiler allowed to add functions to standard headers?的公认答案中所描述的,一个符合的实现不允许喷出可能与应用程序冲突的标识符(“影响严格符合程序的行为”)。
问题的根源是POSIX,这是一个与ISO 9899不协调的破碎标准。

相关问题