提问者:小点点

我相信[DCL.Typedef/1有一个缺陷,否则我遗漏了什么?


[Decl.PRE/10:

如果decl-specifier-seq包含说明符,则该声明称为typedef声明,并且每个declarator-id被声明为typedef-name,与其关联的类型(dcl.typedef)同义。

[注4:declarator-id是一个标识符(class.conv.fct)。结束注]

如果decl-specifier-seq不包含说明符,则如果与declarator-id关联的类型是函数类型(dcl.fct]),则该声明称为函数声明,否则称为对象声明。

[DCL.Typedef/1:

包含decl-specifier的声明声明了以后可用于命名基本类型或复合类型的标识符。说明符不得在decl-specifier-seq中与除定义类型说明符之外的任何其他类型的说明符组合,并且不得在参数声明(DCL.fct])的decl-specifier-seq中使用,也不得在函数定义(DCL.fct.def)的decl-specifier-seq中使用。如果说明符出现在没有声明符的声明中,则程序的格式不正确。

下面的代码显示了两个typedef声明:

typedef struct A{ int i; } structA;

typedef const int CI;

第一个很好,因为它满足[dcl.typedef/1中突出显示的文本,如下所示:

是类说明符,它是定义类型说明符。br>是类型说明符名称。

正如我们所知,第二个声明会编译,但它不应该编译,同样根据上面突出显示的文本,如下所示:

是CV-限定符,它是类型说明符,它是定义类型说明符。br>是简单类型说明符,它是类型说明符,它是定义类型说明符。

也就是说,我们在同一个声明中有两个defining_type_specifier。我不是一个以英语为母语的人,我假设表达式“except a defining-type-specifier”中的冠词“a"意味着声明中只接受一个defining_type_specifier,根据所提到的段落。

代码:

typedef struct A{ int i; } structA;
typedef const int CI;

int main()
{
}

共1个答案

匿名用户

下面描述的这个规则有一些例外,允许您编写这样的构造:

typedef const signed short int si;

[DCL.Type.General/2]

作为一般规则,在声明的完整中最多允许一个,在中最多允许一个。这一规则的唯一例外情况如下:

    可以与任何类型说明符组合,但其本身除外。/li> 可以与任何类型说明符组合,但其本身除外。/li> 可以与组合使用 可以与组合使用 可以与组合使用 可以与组合使用