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

Why can C compile time() without its library?

本文关键字:编译 情况下 time 为什么      更新时间:2023-10-16

当我使用time()函数(即,只是随机化rand()的种子)但不包含头文件time.h时,它适用于 C。例如:

#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;
}

当我尝试编译上面的代码时,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));
^

它与 gcc 的版本有关还是只是 C/C++ 之间的差异?

您应该包含 time(2) 的<time.h>并打开警告。在 C 语言中,假定没有可见原型的函数返回int(自 C99 以来已弃用)。因此,使用gcc进行编译似乎很好,而g++则不然。

编译方式:

gcc -Wall -Wextra -std=c99 -pedantic-errors file.c

你会看到gcc也对此有所抱怨。

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位,那么调用很可能有效。如果它们的大小不同,则可能会表现得很糟糕。(如果NULL是类型void*,则void*time_t*虽然它们不兼容,但可能具有相同的表示形式 - 但返回类型仍然可能是个问题。

当然,解决方案是不要那样做。如果使用标准库函数,请始终为声明它的标头提供#include指令。

相关文章: