从字面上看,这是有道理的,但是作为变量名的重要字符究竟意味着什么?
我是使用 K&R 的 C 初学者。这是书中的直接引述:
“至少内部名称的前 31 个字符是重要的。对于函数名称和外部变量,该数字可能小于 31,因为外部名称可能被语言无法控制的汇编程序和加载程序使用。对于外部名称, 标准只保证 6 个字符和一个大小写。”
顺便问一下,“单例”是什么意思?
从字面上看,这是有道理的,但是作为变量名的重要字符究竟意味着什么?
我是使用 K&R 的 C 初学者。这是书中的直接引述:
“至少内部名称的前 31 个字符是重要的。对于函数名称和外部变量,该数字可能小于 31,因为外部名称可能被语言无法控制的汇编程序和加载程序使用。对于外部名称, 标准只保证 6 个字符和一个大小写。”
顺便问一下,“单例”是什么意思?
Single Case 通常表示“小写”。除了在某些操作系统中它意味着“大写”。关键是混合大小写不能保证有效。
abcdef
ABCDEF
仅在情况下有所不同。这不能保证有效。
“重要性”问题是有多少个字母可以相同。
假设我们只有 6 个有效字符。
a_very_long_name
a_very_long_name_thats_too_similar
看起来不同,但前 16 个字符是相同的。由于只有 6 个是显着的,因此它们是相同的变量。
它意味着你害怕它意味着什么。对于外部名称,K&R 第 2 版时的 C 标准。写的确实只给出了六个不区分大小写的字符!所以你不能拥有afoobar
和aFooBaz
作为独立的实体。
这种荒谬的限制(用于容纳现在早已不复存在的遗留链接器)不再与任何环境相关。C99 标准为外部名称和内部名称提供 31 个区分大小写的字符,并且在实践中常用的链接器支持更长的名称。
它只是意味着如果你有两个变量命名
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 牢牢记住。
高温高压
干杯,