首页 > 解决方案 > 由唯一类型限定符组成的声明说明符

问题描述

longsigned longlong intsigned long int都指定相同的类型是明确定义的。实际上,N2310/6.7.2(p5)

每个逗号分隔的多重集都指定相同的类型,除了位域,说明符 int 指定与 相同的类型signed int还是与 . 相同的类型是实现定义的unsigned int

据我所知,int可以简单地省略。现在考虑声明:

const a;

GCC警告说

warning: type defaults to ‘int’ in declaration of ‘a’

语法允许这样的声明,因为declaratorhere 是一个标识符a, thedeclaration-specifiers是一个类型限定符constN2310/6.7(p1)

declaration:
    declaration-specifiers init-declarator-list opt ;
    [...]
declaration-specifiers:
    [...]
    type-qualifier declaration-specifiers opt
    [...]

但是通过标准部分6.76.7.3(甚至没有这样的例子)我无法证明这样的声明实际上隐含地声明了ato的类型const int

根据标准a,声明中应该有什么类型?const a;

标签: clanguage-lawyerdeclaration

解决方案


6.7.2p2:

在每个声明的声明说明符中,以及每个结构声明和类型名称的说明符-限定符列表中,至少应给出一个类型说明符。

const a;是无效的。


C89/C90 过去int在这些情况下默认为,这就是编译器仍然支持它的原因,但“隐式 int”在 C99 中被正式删除。

ISO 9899:1990 在6.5.2 类型说明符下有以下条目:

  • int, signed, signed int, 或没有类型说明符

推荐阅读