Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';“的确切角色是什么?”;“重要字符”;在C语言中(变量)?_C - Fatal编程技术网

什么';“的确切角色是什么?”;“重要字符”;在C语言中(变量)?

什么';“的确切角色是什么?”;“重要字符”;在C语言中(变量)?,c,C,在C语言中“重要字符”的确切作用是什么,特别是在变量领域?我读过主题“”,但我真的不明白有意义字符的确切规则。我唯一能理解的是这个主题已经灭绝了,但我仍然需要知道 在旧的C语言时代,当编译器和程序在内存非常有限的机器上运行时(想想千字节,而不是千兆字节),那么为了节省内存,编译器最多只使用八个(早期的编译器)标识符字符(变量名、函数名等)。这是“有效字符”的角色,是编译器在源代码中用于名称的字符数。没有角色-有效字符数是C链接器施加的限制。早期的链接器使用了31个字符的限制。这就是我的想法 这意

在C语言中“重要字符”的确切作用是什么,特别是在变量领域?我读过主题“”,但我真的不明白有意义字符的确切规则。我唯一能理解的是这个主题已经灭绝了,但我仍然需要知道

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

没有角色-有效字符数是C链接器施加的限制。早期的链接器使用了31个字符的限制。

这就是我的想法

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

ab..(27个字符)…yz123

ab..(27个字符)…yz578

将被视为:

ab..(27个字符)…yz


因此,您可以得到重新声明错误…

在当前的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个字符的monocase(但这被认为是对现有链接器的痛苦让步),因此
strcmp
strcmp
可能与
abcdefg
abcdefz
相同。部分问题可能是Fortran;它只需要支持6个字符的单例名称,因此Fortran广泛使用的系统上的链接器不需要支持更长的名称


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

在对该问题的回答中,您到底不明白什么?好的,声明两个非常相似的变量,它们的差异仅限于“案例”是真的吗在c的早期是一个很大的风险吗?@kaymas哦,是的,非常肯定。从编译器的角度来看,
foo_bar_123
foo_bar_135
这两个名字被认为是相同的。我认为限制是由于链接器的限制,而不是编译器的限制。还有一些早期的(Fortran兼容,基于大型机?)链接器对外部名称的单选框限制为6个字符。C89标准只能强制使用6个字符的单选框(因此
A12345
A12345
是相同的)对于C99,他们将需求增加到31个字符。大多数系统支持更多,因为C++名称的修改一般需要长名称。@ KayMax,好的。区分大小写一直是C的一部分,但是一些早期链接器不关心名称的情况,例如函数名为“代码> FoO < /代码>和一个代码>o将导致重新定义错误。好的,但情况如何?假设这两个变量都有31个字符:ab..27char..yz&ab..27char..yZ;它们仍然是一个变量吗?@kaymas:有些语言区分大小写,有些不区分大小写,并且可以将使用区分大小写和不区分大小写混合语言编写的组件链接在一起。有些系统要求不区分大小写的语言必须以大写形式导出所有标识符(因此,如果函数Foo是用Pascal编写的,C代码将需要以Foo的形式调用它),但其他函数使用不区分大小写的链接