自动类型默认为int而不是long

时间:2018-08-20 04:16:14

标签: c++ c auto lexical-analysis

我遇到了以下示例,其中自动声明默认为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

1 个答案:

答案 0 :(得分:5)

如果要类型推断,auto是C ++功能。您可以尝试使用g ++进行编译吗?

在C和C ++ 98 / C ++ 03中,auto是一个冗余关键字,表示“ automatic variable”。因此,在您的示例中,i是一个没有显式类型的变量,因此将其视为int(但是C99和更高版本需要诊断)。

相关问题