【问题标题】:typedef - Primitive type to primitive typetypedef - 原始类型到原始类型
【发布时间】:2012-11-30 16:23:59
【问题描述】:

对于一个原始类型到另一个原始类型的 typedef 是否有效?

typedef int long;

在 VS 2012 上,发出警告但编译正常。

警告 C4091: 'typedef' : 当没有声明变量时,'long' 左侧被忽略

但是在 gcc-4.3.4 上,它失败了。

错误:声明没有声明任何东西。

哪个编译器符合标准?

PS:我不会在生产代码中写这样的东西。刚刚想到并检查。

【问题讨论】:

  • 不确定,但这对我来说似乎是一个可怕的想法。第一个问题是您已经确定的问题。除此之外,任何加入您项目的新程序员都可能会在看代码时被愚弄。如果需要将代码移植到 int 意味着不同(例如更大)的系统,会发生什么?
  • @JonathanWood 我明白,但只是在这里检查语言规则。我不会写这样的东西。

标签: c++ visual-studio-2012 typedef language-lawyer gcc4


【解决方案1】:

它是有效的 C++

没有。 C++11,第 7.1.3.6 节:

在给定范围内,不应使用 typedef 说明符重新定义在该范围内声明的任何类型的名称以引用不同的类型。

【讨论】:

  • 我相信它实际上是有效的 C++。它不会被解析为intlong 的typedef,而是作为int long 的typedef(与long int 或只是long 相同)指定没有给该类型的名称。如果示例是例如,这将是无效的。 typedef int char; 代替。
  • 虽然由于您引用的原因,OP 试图完成的工作是不可能的,但还应注意,这不是收到错误/警告的原因。错误/警告是因为“int long”被解释为单一类型,所以 typedef 无效。在这种情况下,VC++ 会发出警告并继续运行。 GCC 更严格。哪个更正确——谁知道呢。这可能是留给编译器的实现细节。
  • @Cat Plus Plus 为什么不能这样解释规则 (ideone.com/FbB7ZY)?
  • @SeanCline - Re 哪个更正确 - 两者都是。如果程序包含违反任何可诊断规则的行为,该标准仅要求符合标准的实现必须发出至少一条诊断消息。实施超出此范围的操作取决于实施。它可以立即停止;忽略问题并继续;以某种方式读懂程序员的想法,解决问题,然后继续;等等。大多数编译器都试图做读心术,这样他们就可以一次捕捉到多个错误。 (当检测到错误时,他们也倾向于跳过创建可执行文件。)
  • @Angew:它仍然无效,因为typedef 必须声明一个类型名称。 C++11, 7/3:“在 simple-declaration 中,可选的 init-declarator-list 只能在声明类或枚举时省略”( init-declarator-list 是包含被声明的标识符的部分)。
【解决方案2】:

他们都在说同样的事情,但有人将其报告为错误。请注意,VS 警告显示“typedef 已被忽略”。问题是int longlong int 是同义词,所以你基本上是在创建一个未命名的typedeflong

【讨论】:

    【解决方案3】:

    两者都符合标准的要求。该 typedef 无效,两个编译器都会发出诊断信息。

    【讨论】:

      猜你喜欢
      • 2018-01-12
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 1970-01-01
      • 2021-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多