说明符的语法typedef
:
typedef <existing_name> <alias_name>
例如:
typedef long unsigned int Int;
它工作正常。
但是,如果我typedef
在声明中的任何地方放置,就像这样:
long unsigned typedef int Int;
然后,它也工作正常。
为什么?我们typedef
可以在声明中的任何地方放置吗?
说明符的语法typedef
:
typedef <existing_name> <alias_name>
例如:
typedef long unsigned int Int;
它工作正常。
但是,如果我typedef
在声明中的任何地方放置,就像这样:
long unsigned typedef int Int;
然后,它也工作正常。
为什么?我们typedef
可以在声明中的任何地方放置吗?
首先,引用 §6.11.5,“未来的语言方向”
1 将存储类说明符放置在声明中的声明说明符开头以外的位置已过时。
所以,不要依赖这个,因为它将来可能会被删除。
也就是说,要了解为什么会这样,请查看 C11 标准,第 6.7.2 章:
[...] 类型说明符可以以任何顺序出现,可能与其他声明说明符混合。
从 §6.7.1,我们知道typedef
它是一个存储类说明符(一种特殊的声明说明符),因此它可以放在类型说明符之后(或之前)(即,可以混合使用)。它不会改变任何东西。
这确实是 C 标准允许的。typedef
是存储类说明符,如果您查看 C 标准中给出的语法(N1570,C11 的最新草案,§6.7 p1):
语法
声明:
. 声明说明符 init-declarator-list (opt) ;
. 静态断言声明
声明说明符:
。 存储类说明符声明说明符(选择)
。 类型说明符声明说明符(选择)
。 类型限定符声明说明符(opt)
。 函数说明符声明说明符(opt)
。 对齐说明符声明说明符(opt)
init-declarator-list:
。 初始化声明器
。 初始化声明器列表,初始化声明器
初始化声明器:
。 声明者
。 声明器 = 初始化器
存储类说明符可以出现在其他声明说明符之后,例如类型说明符。
但是你不应该使用它,它已经过时了,见§6.11.5:
除了在声明中的声明说明符的开头之外,存储类说明符的放置是一个过时的功能。