这段代码给了我警告:
$ cat test.c
#include<stdio.h>
#include<time.h>
int main() {
time_t t;
scanf("%lld", &t);
printf("%lld\n", t);
return 0;
}
$ gcc test.c -o test
test.c: In function ‘main’:
test.c:7: warning: format ‘%lld’ expects type ‘long long int *’, but argument 2 has type ‘time_t *’
test.c:8: warning: format ‘%lld’ expects type ‘long long int’, but argument 2 has type ‘time_t’
$
除警告外,代码按预期工作。
我怎么办才能在编译时得不到警告(请不要编译编译器技巧)?
答案 0 :(得分:8)
time_t
的确切类型取决于您的平台和操作系统。它仍然经常是32位(int
或long
),而不是64,有些甚至使用浮点数。正确的做法是读入已知大小的整数(int
或long long
),然后将值分配给time_t
作为第二步。
答案 1 :(得分:3)
您需要的格式与系统的time_t定义相匹配。用
编译gcc test.c -o test --save-temps
然后
grep time_t test.i|grep typedef
最有可能的是,这会告诉你time_t是“long int”,所以你需要用“%ld”扫描它。
答案 2 :(得分:2)
首先,您的编译器是正确的:没有任何保证time_t实际上是64位有符号整数。它可以是32位整数甚至是浮点值,具体取决于平台。
现在,如果您绝对,肯定确保time_t
是您平台上的long long
,并且您希望避免格式化警告,你可以这样做:
time_t t;
scanf("%lld", (long long *) &t);
printf("%lld\n", (long long) t);
答案 3 :(得分:1)
使用scanf()
的已知大小的整数,然后将结果转换为time_t
:
#include <stdio.h>
#include <time.h>
int main()
{
long long llv;
time_t t;
scanf("%lld", &llv);
t = llv;
printf("%lld\n", (long long)t);
return 0;
}
在这个例子中,它似乎并没有给你带来太大的影响,但如果你想将变量t
传递给某些时间操作函数,那么你就可以使用正确的类型了。
如果您查看({1}}的(POSIX扩展版本)的链接网址,您会发现那里没有提及scanf()
类型。因此,使用time_t
读取time_t
值的任何机制都必须比直接更少。同上,任何打印scanf()
值的内容也都比直接前提更差。