17

说明符的语法typedef

typedef <existing_name> <alias_name>

例如:

typedef long unsigned int Int;

它工作正常。

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

long unsigned typedef int Int;

然后,它也工作正常。

为什么?我们typedef可以在声明中的任何地方放置吗?

4

2 回答 2

17

首先,引用 §6.11.5,“未来的语言方向”

1 将存储类说明符放置在声明中的声明说明符开头以外的位置已过时。

所以,不要依赖这个,因为它将来可能会被删除。


也就是说,要了解为什么会这样,请查看 C11 标准,第 6.7.2 章:

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

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

于 2017-08-18T07:20:02.270 回答
7

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

语法
声明:
. 声明说明符 init-declarator-list (opt) ;
. 静态断言声明
声明说明符:
存储类说明符声明说明符(选择)
类型说明符声明说明符(选择)
类型限定符声明说明符(opt)
函数说明符声明说明符(opt)
对齐说明符声明说明符(opt)
init-declarator-list:
初始化声明器
初始化声明器列表,初始化声明器
初始化声明器:
声明者
声明器 = 初始化器

存储类说明符可以出现其他声明说明符之后,例如类型说明符

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

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

于 2017-08-18T07:22:59.700 回答