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

hgncfbus  于 2023-05-18  发布在  其他
关注(0)|答案(2)|浏览(176)

当我使用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++之间的差异?

w1jd8yoj

w1jd8yoj1#

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

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

你会看到gcc也抱怨这个问题。

polhcujo

polhcujo2#

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*虽然不兼容,但很可能具有相同的表示形式-但返回类型仍然可能是一个问题。 当然,解决方案是 * 不要这样做 *。如果你使用标准库函数,*always* 为声明它的头文件提供一个#include`指令。

相关问题