【问题标题】:Why must the first 31 characters of an identifier be unique?为什么标识符的前 31 个字符必须是唯一的?
【发布时间】:2013-11-11 12:05:10
【问题描述】:

MISRA 2004 规则 5.1 规定所有标识符的前 31 个字符必须是唯一的。这个规则的原因是什么?这是某些编译器的技术限制吗?

【问题讨论】:

标签: c misra


【解决方案1】:

C 标准只保证标识符中一定数量的初始字符是有意义的。对于 C99,这是 31 个字符的外部标识符。即使这是 ANSI/IS C 的一大进步,它只保证外部标识符只有 6 个有效字符……(所以如果你想知道为什么这么多旧的 C 函数有不可发音的名称,这是一个原因。)

实际上,编译器倾向于在标识符中支持更多的重要字符(IIRC C 标准甚至有一个脚注鼓励这一点),但 MISRA 可能希望选择一个已经由当时最 -最新的 C 标准 C99,没有施加 C90 保证的 6 个限制,否则 MISRA 2004 会遵循。

编辑:由于它在 cmets 中被质疑过两次,让我澄清一下:MISRA 2004 不遵循 C99,并且没有确凿的证据表明 C99 标准有助于 MISRA 选择的具体限制31 个字符。但是,该限制不是来自 C90 (ISO C),因为 C90 指定了 6 个字符的限制。因此,人们必须要么接受 MISRA 独立选择了 31,要么在此特定决定中遵循 C99 的示例。当然,由于当时流行的编译器的下限,可能两者都选择了相同的数字,但至少可以说,旧 C99 的示例验证了选择。

【讨论】:

  • 相反,MISRA 明确要求编译器比 C 标准更多——这就是规则的目的。 C99 与 MISRA-C 2004 无关。
  • @Lundin 我只是在这个特定限制的背景下发言,其中 MISRA 要求超过 C99(MISRA 2004 之前建立的最新 C 标准)– 31字符是一个任意限制,所以我的猜测是他们从 C99 标准中获取它以最大限度地与现代编译器兼容,同时避免 ANSI C 荒谬的严格 6 字符保证。(您粘贴的部分理由与这个猜测一致;他们没有提到 C99,但数字 31 几乎肯定来自那里,因为几乎每个编译器都支持更多。)
  • 这个问题是关于 MISRA-C:2004 的,它明确禁止使用除 C90 之外的任何其他标准,因此当与 MISRA 2004 一起谈论“C 标准”时,您总是指 C90。 (对于 C99 支持,您可以使用 MISRA-C:2012,这是一个完全不同的文档)
  • @Lundin 在我的回答中,我的意思只是 说的是 C99; MISRA 在其他地方指定什么并不重要。但是这个论点是毫无意义的;无论 MISRA 选择 31 个字符的限制是什么原因,这显然是基于这样一个事实,即符合标准的编译器不需要在标识符中支持任意多个重要字符。 MISRA 自己的理由没有说明他们从哪里得到 31,所以我个人猜测它来自 C99。该猜测是否正确对于回答问题甚至无关紧要。 =)
  • Arkku - 正如@Lundin 所说,MISRA-C:2004 仅引用了 C90 的合规性(规则 1.1)。 31 个字符的限制源于 C90。在讨论 MISRA-C:2004 时,任何对 C99 的引用都是无关紧要的。
【解决方案2】:

MISRA-C:2004 遵循 C90 标准,仅要求将标识符的前 6 个字符视为不同的字符。您可以阅读 MISRA 文档中的基本原理。

MISRA-C:2004 规则 14:

ISO 标准要求外部标识符在 前 6 个字符。然而,遵守这种严重且无益的 限制被认为是不必要的限制,因为大多数 编译器/链接器允许至少 31 个字符的重要性(至于 内部标识符)。

所指的 ISO 标准是 ISO 9899:1990 (C90)。该规则的目的是确保您使用的是具有足够重要字符的健全、安全的编译器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 2011-03-27
    • 2018-05-16
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多