C 为什么标识符的前31个字符必须是唯一的?

C 为什么标识符的前31个字符必须是唯一的?,c,misra,C,Misra,规则5.1规定,所有标识符的前31个字符必须是唯一的。这条规则的原因是什么?这是某些编译器的技术限制吗?C标准只保证标识符中一定数量的初始字符是有效的。对于C99,外部标识符为31个字符。甚至这与ANSI/is C相比也是一个巨大的进步,ANSI/is C只保证外部标识符只有6个有效字符…(因此,如果您想知道为什么这么多旧的C函数都有无法发音的名称,这就是一个原因。) 实际上,编译器倾向于在标识符中支持更多的有效字符(IIRC C标准甚至有一个脚注鼓励这样做),但MISRA可能想选择一个“安全”

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

C标准只保证标识符中一定数量的初始字符是有效的。对于C99,外部标识符为31个字符。甚至这与ANSI/is C相比也是一个巨大的进步,ANSI/is C只保证外部标识符只有6个有效字符…(因此,如果您想知道为什么这么多旧的C函数都有无法发音的名称,这就是一个原因。)

实际上,编译器倾向于在标识符中支持更多的有效字符(IIRC C标准甚至有一个脚注鼓励这样做),但MISRA可能想选择一个“安全”限制,当时最新的C标准C99已经保证了这一限制,不施加6的限制,这将由C90保证,MISRA 2004将遵循该限制


编辑:由于在评论中两次对其提出质疑,请允许我澄清:MISRA 2004不遵循C99,并且没有确凿证据表明C99标准导致MISRA选择了31个字符的限制。但是,限制并非来自C90(ISO C),因为C90指定了6个字符的限制。因此,我们必须接受MISRA只是在没有已知原因的情况下独立选择了数字31,或者(在我看来更可能)在这个特定的决定中遵循了C99的示例。

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

MISRA-C:2004第14条规则:

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


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

这曾经是一些非常旧的编译器(可能还有一些旧的C标准)中的一些旧限制。在实践中,31个字符是合适的,尽管这是一个链接器限制,在[这个答案][1]中有详细讨论。[1] :可能的重复相反,MISRA明确要求编译器提供比C标准更多的信息-这是规则的目的。C99与MISRA-C 2004无关。@Lundin I仅在该特定限制的背景下发言,其中MISRA不需要超过C99(MISRA 2004之前建立的最新C标准)–31个字符是任意限制,因此,我的猜测是,他们从C99标准出发,最大限度地提高了与现代编译器的兼容性,同时避免了ANSI C荒谬严格的6字符保证。(你粘贴的理由部分同意这个猜测;他们没有提到C99,但数字31几乎肯定来自那里,因为几乎每个编译器都支持更多。)这个问题是关于MISRA-C:2004,它明确禁止使用C90以外的任何其他标准,所以当谈到“C标准”时与MISRA 2004一起,您总是指C90。(对于C99支持,您将使用MISRA-C:2012,这是一个完全不同的文档)@Lundin我的意思是,在我的回答中,我说的是C99;MISRA在其他地方指定了什么并不重要。但这个论点是毫无意义的;不管MISRA选择31个字符限制的原因是什么,它显然是基于这样一个事实,即符合标准的编译器不需要支持任意多个符号标识符中有大量字符。MISRA自己的理论没有说明它们从何处得到31个字符,因此我个人的猜测是来自C99。这个猜测是否正确甚至与回答问题无关。=)Arkku-as@Lundin说,MISRA-C:2004仅引用了C90的合规性(规则1.1)。31个字符的限制源于C90。在讨论MISRA-C:2004时,对C99的任何引用都是无关的。