我对K和R C中变量名的内容有些困惑。原始文本如下:
内部名称的至少前31个字符有效。对于函数名称和外部变量,该数字可能少于31,因为外部名称可能被语言无法控制的汇编器和加载器使用。对于外部名称,该标准仅保证6个字符和一个大小写的唯一性。保留诸如if,else,int,float等之类的关键字:您不能将它们用作变量名。它们必须小写。 选择与变量用途相关的变量名是明智的,并且在印刷上不太可能混淆。我们倾向于将短名称用于局部变量,尤其是循环索引,而将长名称用于外部变量。
让我感到困惑的是外部名称,该标准仅保证6个字符和一个大小写的唯一性。这是否意味着对于外部名称,只有6个前导字符是有效的,而其余字符都将被忽略?例如,我们定义了两个外部变量myexvar1和myexvar2,编译器会将这两个变量视为一个吗?如果是这样,为什么他们建议我们为外部变量使用更长的名称?
答案 0 :(得分:7)
这是否意味着对于外部名称,只有6个前导字符是有效的,而其余字符都将被忽略?例如,我们定义了两个外部变量myexvar1和myexvar2,编译器会将这两个变量视为一个吗?
是的,1990年是这样。更确切地说,外部标识符的6个唯一的前导字符是C90标准为编译器设置的 minimum 限制。这当然是疯狂的-这就是为什么此限制在C99中增加到31。
实际上,大多数C90编译器的内部和外部标识符都至少具有31个唯一字符。
如果是这样,为什么他们建议我们为外部变量使用更长的名称?
不确定他们是否建议。但是,在K&R中使用的编码风格经常令人毛骨悚然,因此绝对不是您应该咨询编码风格建议的书。
在现代C语言中,要求(C17 5.2.4.1)具备以下条件:
内部标识符或宏名称中的63个有效首字母
外部标识符中的31个有效初始字符 p>
所以不必太担心恐龙面临哪些限制,而要遵循现代标准C。
在另一个答案中指出,即使对于外部标识符的31个有效初始字符的限制也已被列为过时,这意味着在将来的标准中,此限制可能会进一步增加到255。
答案 1 :(得分:2)
应该告诉我们K&R相当老,所以我认为此后情况有所变化。 我真的不知道为什么在这里给出6个字符的原因:
对于外部名称,该标准仅保证6个字符和一个大小写的唯一性。
但是您必须了解所有编译器所做的工作都是将翻译单元(通常是*.c
文件)翻译成目标文件(*.o
)。而已。编译器不会生成准备运行的程序。
这些目标文件可能包含对在其他目标文件中找到的未解析符号的引用,以及它们自己的外部符号的表,它们提供的外部符号是从外部引用的。这些符号确实具有文本名称,这是您为外部变量指定的名称。
链接程序和动态加载程序仍然必须完成其工作才能构建程序并使其运行。在此过程中,必须解析所有未解析的符号,因此它们将在目标文件中对这些符号执行文本查找。链接器和加载器不是编译器。可能会有关于对待这些名称的规则(我想是在K&R时代)。那就是这个...
因为外部名称可能被语言无法控制的汇编器和装载器使用。
...大约。
这些天,尽管您对K&R的所有关注听起来过时且无关紧要。选择要遵循的新标准。
答案 2 :(得分:2)
这是由于有关将符号导出到系统链接器的长度的历史背景所致。
我引用The New C Standard -- An Economic and Cultural Commentary。
选择6和10的值,以便\ u1234和 \ U12345678可以使用。
Fortran重要字符限制为6个,随后许多 链接器的供应商已有很长时间。需要更长的标识符 支持C ++中的名称处理,可确保大多数现代链接器 在外部标识符中支持更多重要的字符。
常用实现
从历史上看,数量显着 外部标识符中的字符是由 主机供应商提供的链接器。自从MS-DOS成功以来 开发人员习惯于翻译提供自己的供应商 链接器。以前,大多数链接器倾向于由硬件提供 供应商。大型机世界倾向于由以下需求驱动 Fortran,在内部或内部具有六个重要字符 外部标识符。在这种环境下,并非总是可能 用一个更重要的支持替换系统链接器 字符。大型机环境的重要性在不断下降。 1990年代。在现代环境中,通常有可能获得 替代链接器。
因此,主要问题是能够将用C编译的库与用Fortran编译的库链接在一起,而Fortran限制为6。
您可以在给定的参考文献中阅读更多内容。
答案 3 :(得分:0)
那是过去的遗产,不再重要。如今没有编译器具有这些限制,而且这可以追溯到旧的unix产生的时间。原因是(当时和今天)编译器对符号表中名称的限制(31)和当时使用的链接器(6)的限制。
但这不再适用。至少您可以确定,今天的链接器将允许不同的标识符以至少100个公共前缀的形式声明不同的状态。