(K&R)至少内部名称的前31个字符是重要的?

从字面上看,它是有道理的,但它究竟是什么意思成为变量名的重要字符?

我是使用K&R开始学习C语言的人。 这是本书的直接引用:

“至少内部名称的前31个字符是重要的。对于函数名称和外部变量,数字可能小于31,因为外部名称可能被汇编程序和加载程序使用,语言无法控制。对于外部名称,该标准仅保证6个字符和一个案例。“

顺便说一下,“单一案例”是什么意思?

单个案例通常意味着“小写”。 除了某些操作系统,它意味着“大写”。 关键是混合案例不能保证有效。

abcdef ABCDEF 

只有在情况有所不同。 这不能保证有效。

“重要性”问题是多少个字母可以相同的问题之一。

假设我们只有6个重要角色。

 a_very_long_name a_very_long_name_thats_too_similar 

看起来不一样,但前16个字符是相同的。 由于只有6个是重要的,因此它们是相同的变量。

这意味着你担心它意味着什么。 对于外部名称,K&R 2nd ed时的C标准。 写的确实只给了六个不区分大小写的字符! 因此,您不能将afoobaraFooBaz作为独立实体。

这种荒谬的限制(适用于现在已久的传统连接器)不再适用于任何环境。 C99标准为外部名称提供了31个区分大小写的字符,在内部提供了63个字符,实际使用的链接器支持更长的名称。

它只是意味着如果你有两个变量命名

abcdefghijklmnopqrstuvwxyz78901A

abcdefghijklmnopqrstuvwxyz78901B

无法保证将被视为不同的,单独的变量……

这意味着 :

 foobar1 foobar2 

可能是相同的外部名称,因为只需要考虑前6个字符。 单个案例意味着无需区分大写和小写名称。

请注意,几乎所有现代链接器都会考虑更长的名称,但仍然存在限制,这取决于链接器。

天儿真好,

这种有限符号分辨率的问题之一发生在链接时。

多个库中可以存在多个具有相同名称的符号,链接编辑器通常只会找到它找到的第一个与其查找内容匹配的符号。

因此,使用上面的S.Lott示例,如果链接编辑器正在搜索符号“a_very_long_name”,并且在其搜索路径上找到包含符号“a_very_long_name_thats_too_similar”的库,则会使用此符号。 即使包含所需符号的库(即“a_very_long_name”)已在命令中指定,也会发生这种情况。 例如,将库指定为:

 -L/my/library/path -lmy_wrong_lib -lmy_correct_lib 

现在有编译器选项,或更正确的编译时间选项,这些选项会传递给链接编辑器,从而强制搜索链接路径中的多个符号。 然后,这些通常在链接时被引发为错误。

此外,许多编译器(例如gcc)将默认使用此类行为。 您必须显式启用多个定义,以便在链接编辑器找到符号的多个定义时继续执行而不会引发致命错误。

顺便说一下,我强烈建议结合Clovis Tondo的书“ The C Answer Book 2nd ed。 ”进行练习。

这样做真的有助于让C坚持下去。

HTH

干杯,