为什么C可以在没有库的情况下编译time()?

时间:2015-05-16 13:01:10

标签: c++ c gcc g++ time.h

当我使用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 ++有区别?

2 个答案:

答案 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

如果inttime_ttime_t*都恰好是32位,则呼叫可能会起作用。如果它们的大小不同,