我们可以在声明中的任何位置放置“typedef”说明符吗?

时间:2017-08-18 07:13:13

标签: c++ c language-lawyer typedef storage-class-specifier

typedef说明符的语法:

typedef <existing_name> <alias_name>

例如:

typedef long unsigned int Int;

工作正常。

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

long unsigned typedef int Int;

然后,它也正常工作。

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

2 个答案:

答案 0 :(得分:17)

首先,引用§6.11.5,“未来语言指示”

  

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

所以,依赖于此,因为将来可能会删除它。

那就是说,要理解为什么会这样,请查看C11标准,章节§6.7.2:

  

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

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

答案 1 :(得分:7)

C标准确实允许这样做。 typedef存储类说明符,如果你看一下C标准中给出的语法(N1570,C11的最新草案,§6.7p1):< / p>

  

<强>语法
  声明:
  。 declaration-specifiers init-declarator-list (opt);
  。 static_assert声明
  声明-指示符:
  。 存储类说明符声明说明符(opt)
  。 类型说明符声明说明符(opt)
  。 type-qualifier声明说明符(opt)
  。 function-specifier declaration-specifiers (opt)
  。 alignment-specifier declaration-specifiers (opt)
  初始化声明符列表:
  。 初始化声明符
  。 init-declarator-list,init-declarator
  初始化声明符:
  。 声明符
  。 declarator = initializer

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

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

  

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