从字面上看,它是有意义的,但它究竟是什么意思成为变量名的重要字符?
我是使用K& R开始学习C语言的人。这是本书的直接引用:
“至少内部名称的前31个字符是重要的。对于函数名称和外部变量,该数字可能小于31,因为外部名称可能由语言无法控制的汇编程序和加载程序使用。对于外部名称,标准仅保证6个字符和单个案例。“
顺便说一下,“单一案例”是什么意思?
答案 0 :(得分:19)
单一案例通常意味着“小写”。除了某些操作系统,它意味着“大写”。重点是混合的情况不能保证有效。
abcdef
ABCDEF
仅在案例中有所不同。这不能保证有效。
“重要性”问题是可以使用多少个字母之一。
假设我们只有6个重要字符。
a_very_long_name
a_very_long_name_thats_too_similar
看起来不一样,但前16个字符是相同的。由于只有6个是重要的,因此它们是相同的变量。
答案 1 :(得分:5)
这意味着你担心它意味着什么。对于外部名称,K& R 2nd ed时的C标准。写的确实只给了六个不区分大小写的字符!因此,您不能将afoobar
和aFooBaz
作为独立实体。
这种荒谬的限制(适用于现在已久的传统连接器)已不再适用于任何环境。 C99标准为外部名称提供了31个区分大小写的字符,在内部提供了63个字符,实际使用的连接符支持更长的名称。
答案 2 :(得分:3)
这只是意味着如果你有两个名为
的变量 abcdefghijklmnopqrstuvwxyz78901A
,
和
abcdefghijklmnopqrstuvwxyz78901B
,
无法保证将被视为不同的单独变量......
答案 3 :(得分:2)
这意味着:
foobar1
foobar2
可能是相同的外部名称,因为只需要考虑前6个字符。单个案例意味着无需区分大写和小写名称。
请注意,几乎所有现代链接器都会考虑更长的名称,但仍然存在限制,这取决于链接器。
答案 4 :(得分:0)
天儿真好,
此有限符号解析的问题之一发生在链接时。
多个库中可以存在多个具有相同名称的符号,链接编辑器通常只会找到与找到的符号相匹配的第一个符号。
因此,使用上面的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,将默认为此类行为。您必须明确启用多个定义,以便在链接编辑器找到符号的多个定义时继续运行而不会引发致命错误。
BTW我强烈建议您与Clovis Tondo的书“The C Answer Book 2nd ed.”一起完成练习。
这样做真的有助于让C坚持下去。
HTH
欢呼声,