7

C 中“重要字符”的确切作用是什么,尤其是在变量领域?我已阅读主题“<a href="https://stackoverflow.com/questions/1980939/kr-at-least-the-first-31-characters-of-an-internal-name-are-significant"> (K&R) 至少前 31 个字符...”,但我真的不明白有效字符的确切规则。我唯一明白的是这个主题已经灭绝了,但我仍然需要知道!

4

4 回答 4

13

在当前的 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 个字符(将每个通用字符名称或扩展源字符视为单个字符)是一个过时的功能,是对现有实现的让步。

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

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

extern int abcdefghijkjlmnopqrstuvwxyz123456;
extern int abcdefghijkjlmnopqrstuvwxyz123457;

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

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

历史

该标准的先前版本对名称长度的上限有较小的下限。C89 标准只要求外部名称使用 6 个字符的大写字母(但它被认为是对现有链接器的痛苦让步),因此strcmpStrCmp可以是相同的,可以abcdefgabcdefz. 部分问题可能出在 Fortran。它只需要支持 6 个字符的单大写名称,因此在广泛使用 Fortran 的系统上的链接器不需要支持更长的名称。

C99 中的限制与 C11 中的相同。

于 2013-08-17T15:47:25.747 回答
2

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

于 2013-08-17T15:08:30.563 回答
0

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

于 2013-08-17T15:10:01.017 回答
0

这是我的想法,

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

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

将被视为:

ab..(27 characters)..yz

所以你会得到重新声明错误......

于 2013-08-17T15:17:40.697 回答