【问题标题】:Can we place "typedef" specifier anywhere in the declaration? [duplicate]我们可以在声明中的任何地方放置“typedef”说明符吗? [复制]
【发布时间】:2018-01-26 18:49:35
【问题描述】:

typedef 说明符的语法:

typedef <existing_name> <alias_name>

例如:

typedef long unsigned int Int;

一切正常。

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

long unsigned typedef int Int;

然后,它也可以正常工作。

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

【问题讨论】:

  • 为什么不呢? int short static someVar; 也是有效的,对吧?
  • 因为 C 标准规定了这一点。阅读n1570
  • 好但不好,你可以用谷歌搜索“typedef 声明排序”之类的东西。 -编辑你需要知道的 NVM typedef 是一个“存储类”,可以有效地找到欺骗。
  • C 标准说 从句法的角度来看 typedef 只是一个存储类说明符,如 externstatic,因此它可以与类型声明符。
  • @rsp 请不要在问题标题上放置语言标签,有专门用于此目的的标签字段。

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


【解决方案1】:

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

1 将存储类说明符放置在声明中的声明说明符开头以外的位置已过时。

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


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

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

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

【讨论】:

    【解决方案2】:

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

    语法
    声明:
    . 声明说明符 init-declarator-list(opt) ;
    . static_assert-declaration
    声明说明符:
    . 存储类说明符声明说明符(选择)
    . 类型说明符声明说明符(选择)
    . 类型限定符声明说明符(选择)
    . 函数说明符声明说明符(opt)
    . 对齐说明符声明说明符(选择)
    init-declarator-list:
    . 初始化声明器
    . init-declarator-list , init-declarator
    init-declarator:
    . 声明符
    . 声明器 = 初始化器

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

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

    存储类说明符在声明开头以外的位置 声明中的说明符已过时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多