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

Can we place "typedef" specifier anywhere in the declaration?

typedef 说明符的语法:

typedef <existing_name> <alias_name>

例如:

typedef long unsigned int Int;

一切正常。

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

long unsigned typedef int Int;

然后,它也工作正常。

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

首先,引用§6.11.5,"Future language directions"

1 The placement of a storage-class specifier other than at the beginning of the declaration specifiers in a declaration is an obsolescent feature.

所以,不要依赖这个,因为它可能会在未来被移除。


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

[...] the type specifiers may occur in any order, possibly intermixed with the other declaration specifiers.

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

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

Syntax
declaration:
. declaration-specifiers init-declarator-list(opt) ;
. static_assert-declaration
declaration-specifiers:
. storage-class-specifier declaration-specifiers(opt)
. type-specifier declaration-specifiers(opt)
. type-qualifier declaration-specifiers(opt)
. function-specifier declaration-specifiers(opt)
. alignment-specifier declaration-specifiers(opt)
init-declarator-list:
. init-declarator
. init-declarator-list , init-declarator
init-declarator:
. declarator
. declarator = initializer

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

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

The placement of a storage-class specifier other than at the beginning of the declaration specifiers in a declaration is an obsolescent feature.