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( ;
.static_assert声明
声明说明符:
。存储类说明符声明说明符(选项
(。类型说明符声明说明符(
OPT(。类型限定符声明说明符
(OPT(。函数说明符声明说明符(选项
(。alignment-specifier declaration-specifiers(opt(
init-declarator-list:
.初始化声明器
。init-declarator-list ,init-declarator
init-declarator:
.声明符
。声明符 = 初始值设定项
存储类说明符可以出现在其他声明说明符(如类型说明符(之后。
但是你不应该使用它,它已经过时了,参见§6.11.5:
存储类说明符的位置,而不是在声明的开头 声明中的说明符是一个过时的功能。