我正在做一个操作系统项目,要求使用C89和迂腐的标志。
由于我使用的是macOS,在几次练习中,我遇到了很多关于rand()
函数的问题。实际上,它的macOS手册页称它为“坏数字生成器”。因此,为了避免它的问题,我改用了random()
。现在,由于我使用-std=c89
、-pedantic
、wall
和werror
进行编译,它拒绝正确运行,因为有一个关于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
2条答案
按热度按时间wlzqhblo1#
random
和srandom
都不是C标准的一部分。它们是POSIX函数,所以用-std=c89
编译时,它们的原型并不可用。您可以在原始程式档的顶端定义下列其中一项,以使其原型可用:
或
这将启用POSIX以及其他扩展。有关这些宏的详细信息,请查看feature test macros。
r8uurelv2#
C89是否支持随机?
它没有。
现在,由于我使用-std=c89、-pedantic、wall和werror进行编译,由于有一个关于random()隐式声明的警告,它拒绝正确运行。
这是因为当你进入严格符合模式时,编译器不允许将非标准函数放入标准库的愚蠢做法。正如Is a compiler allowed to add functions to standard headers?的公认答案中所描述的,一个符合的实现不允许喷出可能与应用程序冲突的标识符(“影响严格符合程序的行为”)。
问题的根源是POSIX,这是一个与ISO 9899不协调的破碎标准。