首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型胡枝子中同义词的意义

类型胡枝子中同义词的意义
EN

Stack Overflow用户
提问于 2015-07-07 13:17:11
回答 4查看 687关注 0票数 3

以下段落摘自dcl.typedef

在它的声明范围内,ty胡枝子名称在语法上等价于关键字,并以第8条中描述的方式命名与标识符关联的类型。类型-名称不会像类声明(9.1)或枚举声明那样引入新类型。

我们需要的另一篇相关文章来自dcl.type

作为一般规则,最多只允许在声明的完整decl-说明符-seq或类型说明符-seq或尾-类型说明符-seq中允许一个类型说明符。此规则的唯一例外是以下内容:…long可以与long结合。

在下面的代码中,i1只是一个长时间的同义词。

代码语言:javascript
复制
typedef long i1;
typedef long i1 i2;

因此,我期望第二行被理解为typedef long long i2。但是,MSVC2015RC失败了

错误C2146语法错误:在标识符'i2‘之前缺少';’

有人能指出标准中使我的期望无效的部分吗?

更新

我的观点是,就我所理解的dcl.type语法而言,

代码语言:javascript
复制
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确实允许一系列类型说明符,只要它们满足组合规则。在我看来,类型与类型说明符不同,即使类型说明符指定了类型;-)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-07-07 13:55:22

好吧,我来回答。

首先,看看这个:

类型胡枝子名在语法上等价于关键字。

这只意味着typedef名称遵循关键字的语法。这并不意味着typedef名称等同于任何特定的关键字。就像一个新的,独特的关键字。

那我们就有了

因此,type name是另一种类型的同义词。

那么,给定typedef long i1;,这“另一种类型”是什么?这是long int,而不仅仅是long

此外,什么是“类型”?至少,类型说明符不是类型.类型说明符long表示类型“长int”(参见n3337的表10或n4296的表9)。

我将在这里复制我的评论:

i1long int类型的同义词。它不是关键字long的同义词。否则,您也可以说i1 double并得到一个long double

虽然我应该说,i1不是类型说明符long的同义词,但它是long int类型的同义词。

票数 5
EN

Stack Overflow用户

发布于 2015-07-07 13:21:15

AFAIK,没有语法规则告诉long T是一个有效的类型,一旦T是一个有效的类型。(但是对于volatileconst这样的限定符有一些相关的规则)

换句话说,long long几乎应该被看作是一个“多词关键字”(但是C& C++标准化委员会非常不愿意引入新的关键字)。

因此,我不认为以下内容是有效的

代码语言:javascript
复制
 // probably invalid
 typedef int fooT;
 unsigned fooT barv;
票数 3
EN

Stack Overflow用户

发布于 2015-07-07 13:53:21

dcl.type第2款对longshortsignedunsignedconstvolatile都有规定。

作为一般规则,在声明的完整decl-specifier-seq中,或在type-specifier-seq或尾-type- type-specifier -seq中,最多允许使用一种类型-specifier-seq。这一规则的唯一例外情况如下:

  • const可以与除其本身以外的任何类型的fier组合。
  • 易失性可以与除自身以外的任何类型的specifier组合。
  • 有符号或无符号可以与字符、长、短或int组合。
  • 短或长可以与int结合。
  • 龙可以结合双倍。
  • long可以与long结合。

因此

代码语言:javascript
复制
typedef long i1;
typedef const i1 i2;

是有效的,因为const可以与任何类型的说明符在

代码语言:javascript
复制
typedef long i1;
typedef long i1 i2;

不是因为i1long的名称,但它不是说明符long本身。

在您的示例中,i1在语法上可能等同于关键字,但它不属于允许与long组合的说明符。它是一个不同的关键字,因此与long组合的规则不适用于它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31269660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档