C(变量)中“重要字符”的确切作用是什么?

C中“重要字符”的确切作用是什么,特别是在变量领域? 我已经阅读了主题“ (K&R)至少前31个字符…… ”,但我真的不明白重要字符的确切规则。 我唯一理解的是这个主题已经绝迹,但我仍然需要知道!

在当前的C标准中,ISO / IEC 9899:2011,第5.2.4.1节的翻译限制说:

该实现应能够翻译和执行至少一个包含以下每个限制的至少一个实例的程序: 18)


– 内部标识符或宏名称中的63个重要初始字符(每个通用字符名称或扩展源字符被视为单个字符)
– 外部标识符中的31个重要的初始字符(指定短标识符0000FFFF或更少的每个通用字符名称被认为是6个字符,指定短标识符00010000或更多的每个通用字符名称被认为是10个字符,并且每个扩展源字符是被认为与相应的通用字符名称相同的字符数,如果有的话) 19)

18)实施应尽可能避免强加固定的翻译限制。
19)参见”未来语言方向”(6.11.3)。

§6.11.3 外部名称
¶1将外部名称的重要性限制为少于255个字符(将每个通用字符名称或扩展源字符视为单个字符)是一种过时的function,它是对现有实现的让步。

这意味着在处理名称时,编译器必须将前63个字符中不同的内部名称视为不同,但如果您被误导足以创建仅在第64 字符中不同的两个(或更多)标识符(前63个是相同的,但是一个中的 64 字符是1 ,而另一个是z ),那么编译器可以合法地,并且在没有警告的情况下将这两个标识符视为相同。

外部名称的限制 – 影响链接器的名称而不是编译器本身 – 可能限制为31个字符。 考虑:

 extern int abcdefghijkjlmnopqrstuvwxyz123456; extern int abcdefghijkjlmnopqrstuvwxyz123457; 

如果系统(链接器)将您限制为31个字符,则可以将这两个声明视为引用相同的变量。

正如未来的路线部分所述,任何短于255的限制都是“过时的”,这意味着在名称长度为255个字符之前不应受此限制。 但该标准尚未规定255个字符作为限制。

历史

该标准的先前版本在名称长度的上限上具有较小的下限。 C89标准仅对外部名称强制使用6个字符的单体StrCmp (但它被认为是对现有连接器的痛苦让步),因此strcmpStrCmp可以是相同的,如abcdefgabcdefz 。 部分麻烦可能是Fortran; 它只需要支持6个字符的单体名称,因此在Fortran被广泛使用的系统上的连接器不需要支持更长的名称。

C99的限制与C11相同。

在C的旧时代,当编译器和程序在内存非常有限的机器上运行时(想想千字节而不是千兆字节)然后为了节省内存,编译器最多只使用8个(在早期编译器上)标识符的字符(名称)变量,函数等)。 这是“重要字符”的作用,它是编译器用于源中名称的字符数。

这就是我的想法,

这意味着将忽略前31个字符后的所有字符,即变量名称:

ab..(27 characters)..yz123
ab..(27 characters)..yz578

将被视为:

ab..(27 characters)..yz

所以你可以得到重新声明错误…

没有任何作用 – 重要字符的数量是C链接器施加的限制。 早期接头使用了31个字符限制。