2009-12-30 23 views
12

当从字面上理解时,它是有道理的,但是它是什么意思是变量名的重要特征?(K&R)内部名称的前31个字符至少有意义?

我用k & R.下面是从书中直接引用的C一开始学习:

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

顺便说一句,“单一情况”是什么意思?

+0

如果你刚开始C,你为什么想知道K&R? Ansi C89/99更加“理智”和流行。 – Earlz 2009-12-30 16:15:08

+0

我不确定为了学习C而购买哪本书。我被另一个人告知,K&R可以教我如何完美地用C语言编程,但是到目前为止,它似乎有时难以理解。它似乎有点含糊,充满了简洁和高级的行话。然而,我可能是错的... – withchemicals 2009-12-30 16:22:08

+3

“K&R C”是K&R书第一版引入的C的原始,现在已经过时的方言。我希望(并且希望!)你实际上有K&R的第二版,它涵盖了ANSI C.这是一本很好的书,但是自那之后,ANSI C标准又有了更多的版本。这些变化并不大,但值得了解。你现在可以得到一些新的类型,比如布尔和long-longs,而且,是的,疯狂的短识别限制大大提高了。 Yup! – bobince 2009-12-30 16:29:43

回答

18

单个案例通常意味着“小写”。除了在某些操作系统中,它的意思是“大写”。问题是混合的情况不能保证工作。

abcdef 

ABCDEF 

只有情况不同。这不能保证工作。

“意义”问题是多少个字母可以相同的问题之一。

比方说,我们只有6个重要字符。

a_very_long_name 

a_very_long_name_thats_too_similar 

看起来不同,但前16个字符是相同的。由于只有6个是重要的,那些是相同的变量。

+0

你真棒!所以只要确保,这个报价是: “对于外部名称,他的标准只保证6个字符和一个个案。“” 是否意味着AbCDeF和abcdef和ABCDEF都不是100%保证是不同的变量?另外,作为一名初级程序员,我是否应该担心所提及的“装配器和装载器”? – withchemicals 2009-12-30 16:17:24

+2

正确。仅仅因情况而不同的事情不能保证工作。他们可能会工作,但这是一个意外。您不会很快使用汇编程序。您的加载程序是您的操作系统的一部分。大多数装载机处理很长的名字。当我是一个n00b程序员(在80年代)时,这个6字符的东西在几个操作系统上是严重的。对于标准操作系统(Linux,MacOS等),不用担心。对于Windows,几乎不用担心。 – 2009-12-30 16:55:41

2

这意味着:

foobar1 
foobar2 

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

请注意,几乎所有的现代链接器都会考虑更长的名称,依赖于链接器,仍然会有一个限制。

3

它只是意味着,如果你有一个名为

abcdefghijklmnopqrstuvwxyz78901A两个变量,

abcdefghijklmnopqrstuvwxyz78901B

,有没有保证,将被视为不同的,独立的变量。 ..

5

这意味着你害怕它的意思。对于外部名称,时间K & R第二版的C标准。写的确实只会给六个不区分大小写的字符!所以你不能有afoobaraFooBaz作为独立的实体。

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

0

G'day,

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

具有相同名称的多个符号可以存在于多个库中,并且链接编辑器通常只会找到它找到的第一个符合要查找的符号。

因此,如果您的链接编辑器正在搜索符号“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,会默认这种行为。如果找到符号的多个定义,则必须明确启用多个定义以允许链接编辑器继续进行而不会引发致命错误。

顺便说一句我强烈建议通过练习与克洛维斯通多的书“The C Answer Book 2nd ed.”一起工作。

这样做确实有助于让C坚持在你的脑海中。

HTH

欢呼声,

相关问题