当我使用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++之间的差异?
2条答案
按热度按时间w1jd8yoj1#
您应该为time(2)包含
<time.h>
并打开警告。在C中,没有可见原型的函数被假定返回int
(自C99以来已被弃用)。所以用gcc
编译似乎很好,而用g++
编译则不行。编译工具:
你会看到
gcc
也抱怨这个问题。polhcujo2#
C89/C90(通常但不正确地称为“ANSI C”)有一个“隐式
int
”规则。如果你调用一个没有可见声明的函数,编译器将有效地创建一个隐式声明 * 假设 * 该函数接受调用中出现的类型的参数并返回int
。time
函数接受time_t*
类型的参数,并返回time_t
类型的值。所以接到电话如果没有可见声明,编译器将生成代码 *,就好像 * 它接受了
NULL
类型的参数(可能是int
)并返回int
结果。鉴于time(NULL)
返回的值将从int
隐式转换为unsig 如果
int、
time_t和
time_t*恰好都是32位,则调用可能会工作。如果它们的大小不同,很可能会表现得很糟糕。(如果
NULL的类型是
void*,那么
void*和
time_t*虽然不兼容,但很可能具有相同的表示形式-但返回类型仍然可能是一个问题。 当然,解决方案是 * 不要这样做 *。如果你使用标准库函数,*always* 为声明它的头文件提供一个
#include`指令。