C++ 为什么C编译时()没有它的库?
当我使用C++ 为什么C编译时()没有它的库?,c++,c,gcc,g++,time.h,C++,C,Gcc,G++,Time.h,当我使用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; } 它与gcc的版本有关,还
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;
}
它与gcc的版本有关,还是只是C/C++之间的差异?您应该包括并打开警告。在C语言中,一个没有可见原型的函数被假定为返回int
(自C99以来一直被弃用)。因此,使用gcc
编译似乎不错,而g++
则不行
编译时使用:
gcc -Wall -Wextra -std=c99 -pedantic-errors file.c
你会看到gcc也抱怨它。C89/C90(通常被错误地称为“ANSIC”)有一个“隐式int
”规则。如果调用没有可见声明的函数,编译器将有效地创建一个隐式声明,假设该函数接受调用中出现的类型的参数并返回int
time
函数接受类型为time\u t*
的参数,并返回类型为time\u t
的值。所以我打了个电话
time(NULL)
在没有可见声明的情况下,编译器将生成代码,就像它接受了NULL
(可能是int
)类型的参数一样,并返回int
结果。给定
srand(time(NULL))
time(NULL)
返回的值将从int
隐式转换为`unsig>
如果int
、time\u t
和time\u t*
都恰好是32位,那么调用可能会工作。如果它们的大小不同,#include
IIRCstdlib.h
不保证包含time.h
;C++和C版本不同,因为那里使用条件宏。也许这与此有关。顺便说一下,在C++中使用<代码> >代码>和<代码> >代码>(或者更好的C++标题)(如果你不知道),在C99中没有禁止“隐式<代码> int >代码>,它完全被删除了。在C99及更高版本中,调用没有可见原型的函数是违反约束的行为,需要进行诊断。(默认情况下,GCC不符合C99。)
srand(time(NULL))