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

17

typedef 指定符的语法:

typedef <existing_name> <alias_name>
例如:

for example:

typedef long unsigned int Int;

它运行良好。

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

long unsigned typedef int Int;

然后,它也运行良好。

为什么?我们能在声明的任何位置放置typedef吗?


为什么不可以呢?int short static someVar;也是合法的,对吧? - Sourav Ghosh
因为C标准规定了。请阅读n1570 - Basile Starynkevitch
好的,但是不太好,你本可以通过Google搜索“typedef declaration ordering”之类的内容来找到答案。 -编辑NVM,您需要知道“typedef”是一种“存储类”,以便更有效地查找该问题的重复。 - Antti Haapala -- Слава Україні
C标准规定,在语法上,typedef只是像externstatic一样的存储类说明符,因此可以与类型声明符混合使用。 - Serge Ballesta
@rsp 请不要在问题标题上放置语言标签,因为有专门用于此目的的标签字段。 - Sourav Ghosh
类似于这个问题 - Claas Bontus
2个回答

17

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

1 在声明中,存储类别说明符的放置位置不在声明说明符的开头是一个已过时的特性。

因此,不要依赖这个特性,因为它可能在未来被删除。


话虽如此,要理解为什么这样可以,请查看C11标准,第§6.7.2章:

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

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


7
这确实是C标准允许的。如果您查看C标准(N1570,C11的最新草案,§6.7 p1),其中给出的语法规则可以发现,typedef是一种存储类说明符,可以在其他声明说明符之后出现,比如类型说明符。但是您不应该使用它,因为它已经过时了,参见§6.11.5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接