我们可以在声明中的任何位置放置"typedef"说明符吗?

msc*_*msc 17 c c++ typedef language-lawyer storage-class-specifier

typedef说明符的语法:

typedef <existing_name> <alias_name>
Run Code Online (Sandbox Code Playgroud)

例如:

typedef long unsigned int Int;
Run Code Online (Sandbox Code Playgroud)

它工作正常.

但是,如果我typedef在宣言中的任何地方放置,像这样:

long unsigned typedef int Int;
Run Code Online (Sandbox Code Playgroud)

然后,它也工作正常.

为什么?我们typedef可以在宣言中放置任何地方吗?

Sou*_*osh 17

首先,引用§6.11.5,"未来语言方向"

1在声明中声明说明符开头之外的存储类说明符的放置是一个过时的功能.

因此,不要依赖于此,因为它可能在将来被删除.


也就是说,要了解其工作原理,请查看C11标准,第6.7.2节:

[...]类型说明符可以按任何顺序出现,可能与其他声明说明符混合.

从§6.7.1开始,我们知道typedef是一个存储类说明符(一种特殊的声明说明符),因此它可以放在类型说明符之后(或之前)(,可以混合).它没有改变任何东西.


小智 7

这确实是C标准所允许的.typedef是一个存储类说明符,如果你看一下C标准中给出的语法(N1570,C11的最新草案,§6.7p1):

语法
声明:
. declaration-specifiers init-declarator-list(opt);
. static_assert-declaration
声明 - 说明符:
. 存储类说明符声明说明符(opt)
. type-specifier declaration-specifiers(opt)
. type-qualifier声明说明符(opt)
. function-specifier declaration-specifiers(opt)
. alignment-specifier declaration-specifiers(opt)
init-declarator-list :
. init-declarator
. init-declarator-list,init-declarator
init-declarator :
. 声明者
. declarator =初始化器

存储类说明可以出现其他声明说明符类型说明符.

但是你不应该使用它,它已经过时了,参见§6.11.5:

在声明中声明说明符开头之外的存储类说明符的放置是一个过时的功能.