当我使用rand()
函数(即只为time.h
随机化种子)但不包含头文件#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
srand(time(NULL));
for(i=0;i<10;i++){
printf("\t%d",rand()%10);
}
printf("\n");
return 0;
}
时,它适用于C.例如:
g++
当我尝试编译上面的代码时,time.h
无法编译它,因为gcc
未包含在内。但是$gcc ra.c
$./a.out
4 5 2 4 8 7 3 8 9 3
$g++ ra.c
ra.c: In function ‘int main()’:
ra.c:8:20: error: ‘time’ was not declared in this scope
srand(time(NULL));
^
可以。
{{1}}
它与gcc版本有关还是只与C / C ++有区别?
答案 0 :(得分:7)
您应该为time(2)添加<time.h>
并启用警告。在C中,假定没有可见原型的函数返回int
(自C99以来已弃用)。所以使用gcc
进行编译似乎很好,而g++
没有。
编译:
gcc -Wall -Wextra -std=c99 -pedantic-errors file.c
并且您会看到gcc
也抱怨它。
答案 1 :(得分:1)
C89 / C90(通常但不正确地称为“ANSI C”)具有“隐式int
”规则。如果你调用一个没有可见声明的函数,编译器会有效地创建一个隐式声明假设该函数接受调用中出现的类型的参数并返回int
。
time
函数接受类型为time_t*
的参数,并返回类型time_t
的值。所以给了一个电话
time(NULL)
没有可见的声明,编译器将生成代码,好像它采用类型为NULL
的参数(可能是int
)并返回一个int
结果。给定
srand(time(NULL))
time(NULL)
返回的值将被隐式转换为int
到`unsig
如果int
,time_t
和time_t*
都恰好是32位,则呼叫可能会起作用。如果它们的大小不同,