以下段落摘自dcl.typedef
在它的声明范围内,ty胡枝子名称在语法上等价于关键字,并以第8条中描述的方式命名与标识符关联的类型。类型-名称不会像类声明(9.1)或枚举声明那样引入新类型。
我们需要的另一篇相关文章来自dcl.type
作为一般规则,最多只允许在声明的完整decl-说明符-seq或类型说明符-seq或尾-类型说明符-seq中允许一个类型说明符。此规则的唯一例外是以下内容:…long可以与long结合。
在下面的代码中,i1只是一个长时间的同义词。
typedef long i1;
typedef long i1 i2;因此,我期望第二行被理解为typedef long long i2。但是,MSVC2015RC失败了
错误C2146语法错误:在标识符'i2‘之前缺少';’
有人能指出标准中使我的期望无效的部分吗?
更新
我的观点是,就我所理解的dcl.type语法而言,
type-specifier:
trailing-type-specifier
class-specifier
enum-specifier
trailing-type-specifier:
simple-type-specifier
elaborated-type-specifier
typename-specifier
cv-qualifier
type-specifier-seq:
type-specifier attribute-specifier-seq opt
type-specifier type-specifier-seq
trailing-type-specifier-seq:
trailing-type-specifier attribute-specifier-seq opt
trailing-type-specifier trailing-type-specifier-seq一个decl-说明符-seq确实允许一系列类型说明符,只要它们满足组合规则。在我看来,类型与类型说明符不同,即使类型说明符指定了类型;-)
发布于 2015-07-07 13:55:22
好吧,我来回答。
首先,看看这个:
类型胡枝子名在语法上等价于关键字。
这只意味着typedef名称遵循关键字的语法。这并不意味着typedef名称等同于任何特定的关键字。就像一个新的,独特的关键字。
那我们就有了
因此,type name是另一种类型的同义词。
那么,给定typedef long i1;,这“另一种类型”是什么?这是long int,而不仅仅是long。
此外,什么是“类型”?至少,类型说明符不是类型.类型说明符long表示类型“长int”(参见n3337的表10或n4296的表9)。
我将在这里复制我的评论:
i1是long int类型的同义词。它不是关键字long的同义词。否则,您也可以说i1 double并得到一个long double。
虽然我应该说,i1不是类型说明符long的同义词,但它是long int类型的同义词。
发布于 2015-07-07 13:21:15
AFAIK,没有语法规则告诉long T是一个有效的类型,一旦T是一个有效的类型。(但是对于volatile或const这样的限定符有一些相关的规则)
换句话说,long long几乎应该被看作是一个“多词关键字”(但是C& C++标准化委员会非常不愿意引入新的关键字)。
因此,我不认为以下内容是有效的
// probably invalid
typedef int fooT;
unsigned fooT barv;发布于 2015-07-07 13:53:21
dcl.type第2款对long、short、signed、unsigned、const和volatile都有规定。
作为一般规则,在声明的完整decl-specifier-seq中,或在type-specifier-seq或尾-type- type-specifier -seq中,最多允许使用一种类型-specifier-seq。这一规则的唯一例外情况如下:
因此
typedef long i1;
typedef const i1 i2;是有效的,因为const可以与任何类型的说明符在
typedef long i1;
typedef long i1 i2;不是因为i1是long的名称,但它不是说明符long本身。
在您的示例中,i1在语法上可能等同于关键字,但它不属于允许与long组合的说明符。它是一个不同的关键字,因此与long组合的规则不适用于它。
https://stackoverflow.com/questions/31269660
复制相似问题