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

时间:2013-08-17 15:04:32

标签: c

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

4 个答案:

答案 0 :(得分:11)

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

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

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

extern int abcdefghijkjlmnopqrstuvwxyz123456;
extern int abcdefghijkjlmnopqrstuvwxyz123457;

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

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

历史

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

C99的限制与C11相同。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这就是我的想法,

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

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

将被视为:

ab..(27 characters)..yz

因此您可以获得重新声明错误...