我遇到了以下示例,其中自动声明默认为int 而不是long:
#include <stdio.h>
int main(int argc, char **argv)
{
auto i = 999999999999999;
// long i = 999999999999999;
printf("i = %ld\n",i);
return 0;
}
当我编译这段代码时,gcc确实给出了一个相关警告,即i
实际上是int
:
$ gcc -o main main.c
main.c: In function ‘main’:
main.c:4:10: warning: type defaults to ‘int’ in declaration of ‘i’ [-Wimplicit-int]
auto i = 999999999999999;
^
main.c:4:14: warning: overflow in implicit constant conversion [-Woverflow]
auto i = 999999999999999;
^~~~~~~~~~~~~~~
main.c:6:19: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 2 has type ‘int’ [-Wformat=]
printf("i = %ld\n",i);
~~^
%d
但是我想知道为什么gcc的词法扫描器在拥有所有信息的情况下没有将999999999999999
标记为长?这是程序的输出:
$ ./main
i = 2764472319
编辑:
以下是使用g ++的正确答案(来自@Yang)的输出:
$ g++ -o main main.c
$ ./main
i = 999999999999999
还有另一种选择:
$ cp main.c main.cpp
$ gcc -std=c++11 -o main main.cpp
$ ./main
i = 999999999999999
答案 0 :(得分:5)
如果要类型推断,auto
是C ++功能。您可以尝试使用g ++进行编译吗?
在C和C ++ 98 / C ++ 03中,auto是一个冗余关键字,表示“ automatic variable”。因此,在您的示例中,i
是一个没有显式类型的变量,因此将其视为int
(但是C99和更高版本需要诊断)。