在C语言中,“significant characters”(显著字符)的确切作用是什么,特别是在变量领域?我已经阅读了主题“(K&R) At Least the first 31 characters...”,但我真的不理解显著字符的确切规则。唯一我能理解的是这个主题已经过时了,但我仍然需要知道!
在C语言中,“significant characters”(显著字符)的确切作用是什么,特别是在变量领域?我已经阅读了主题“(K&R) At Least the first 31 characters...”,但我真的不理解显著字符的确切规则。唯一我能理解的是这个主题已经过时了,但我仍然需要知道!
...
— 内部标识符或宏名称中的63个重要初始字符(每个通用字符名称或扩展源字符被视为单个字符)
— 外部标识符中的31个重要初始字符(指定0000FFFF或更少的短标识符的每个通用字符名称被视为6个字符,指定00010000或更多的短标识符的每个通用字符名称被视为10个字符,并且每个扩展源字符被视为相应通用字符名称的相同数量的字符,如果有的话)19)
...
18) 实现应尽可能避免强制实施固定的翻译限制。
19) 参见“未来语言方向”(6.11.3)。
§6.11.3 外部名称
¶1 将外部名称的重要性限制在少于255个字符(将每个通用字符名称或扩展源字符视为单个字符)以下是一项过时的功能,这是对现有实现的让步。
1
,而另一个是z
),那么编译器可能会合法地且没有警告地将这两个标识符视为相同。extern int abcdefghijkjlmnopqrstuvwxyz123456;
extern int abcdefghijkjlmnopqrstuvwxyz123457;
如果系统(链接器)限制您只能使用31个字符,则这两个声明可以被视为引用同一变量。
正如未来方向部分所述,任何短于255的限制都是“过时的”,这意味着在名称达到255个字符之前,您不应受到此限制。但标准尚未规定255个字符作为限制。
标准的先前版本对名称长度的上限有更小的下限。 C89标准仅强制要求外部名称为6个字符单大小写(但它被视为对现有链接器的痛苦让步),因此strcmp
和StrCmp
可以相同,abcdefg
和abcdefz
也可以相同。问题的一部分可能是Fortran; 它仅需要支持6个字符的单大小写名称,因此在广泛使用Fortran的系统上的链接器不需要支持更长的名称。
C99中的限制与C11相同。
N2346/6.4.2.1p6
的内容:如果两个标识符仅在不重要的字符上有所不同,则其行为是未定义的。正如你所指出的,编译器可能会合法地且没有警告地将这两个标识符视为相同,但无论如何都是未定义的行为。 - Some Name在早期的C语言中,由于编译器和程序运行的计算机内存非常有限(考虑的是千字节而不是吉字节),为了节省内存,编译器仅使用标识符(变量名、函数名等)中的前八个字符(在早期编译器上)作为名称。这就是"有效字符"的作用,它是编译器在源代码中用于名称的字符数。
A12345
和a12345
是相同的)。到了C99,它们将要求增加到31个字符。大多数系统支持更多,因为C++名称重载通常需要长名称。 - Jonathan LefflerFOO
的函数和一个名为 foo
的函数会导致重新定义错误。 - Some programmer dude这里没有角色 - 重要字符的数量是C链接器所强加的限制。31个字符的限制是早期链接器使用的。
以下是我的想法,
这意味着除了前31个字符以外的所有字符都将被忽略,即变量名:
ab..(27 characters)..yz123
ab..(27 characters)..yz578
将被视为:
ab..(27 characters)..yz
因此您可能会遇到重新声明错误...