字面上理解是有意义的,但是什么是变量名的显著字符呢?
我学习C语言使用K&R,这是书中的直接引用:
“至少前31个字符是内部名称中的显著字符。对于函数名和外部变量,该数字可能小于31,因为外部名称可能被汇编程序和加载器使用,而语言无法控制。对于外部名称,标准只保证了6个字符和一个大小写。”
顺便问一下,“单个情况”是什么意思?
字面上理解是有意义的,但是什么是变量名的显著字符呢?
我学习C语言使用K&R,这是书中的直接引用:
“至少前31个字符是内部名称中的显著字符。对于函数名和外部变量,该数字可能小于31,因为外部名称可能被汇编程序和加载器使用,而语言无法控制。对于外部名称,标准只保证了6个字符和一个大小写。”
顺便问一下,“单个情况”是什么意思?
单个字母大小写通常指小写,但在某些操作系统中可能指大写。重点是混合大小写不能保证可用。
abcdef
ABCDEF
这两个字符串仅在大小写上有所不同。但这并不能保证可行。
“Significance”问题涉及相同的字母数量。
假设我们只有6个有效字符。
a_very_long_name
a_very_long_name_thats_too_similar
看起来不同,但前16个字符是相同的。由于只有6个字符是重要的,因此它们是同一个变量。
afoobar
和aFooBaz
视为独立的实体。这只是意味着如果你有两个变量名为
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语言深入人心。
希望对你有所帮助。
祝好,