509个字符限制的原因解释

20

我见过许多 ANSI C 编译器必须支持的最低要求,例如函数最多支持 31 个参数,大多数数字似乎都有一定的道理。

然而,我无法理解至少需要支持源代码行中的 509 个字符的原因。511 或者 512 更合理,但是 509 似乎有点武断。

这个数字的原因是什么?


6
请参见:https://dev59.com/xWgu5IYBdhLWcg3wOUgk。虽然这个问题本身不是重复的,但那里的一些答案和评论是重复的。 - mbauman
@Ryan Haining,这些“ANSI C编译器”要求中的任何一项是否涉及到过去10年中制作的编译器中的509? - chux - Reinstate Monica
1
@Ryan Haining:“ANSI C”诞生于1989年。考虑到当时计算机的状态(1兆字节在个人电脑上终于不再罕见),人们可以想象编译器编写者和C标准之间的斗争,后者为每个参数声明了某种绝对最小值。这个标准与CR / LF对不匹配是一个完全合理的解释。4095…我需要检查我的代码,但我认为我从来没有想过超过509个字符的最小值。 - Jongware
509个字符长的行是否能通过代码审查? - mouviciel
4个回答

17

这也许是要考虑到可能出现的CR+LF+'\0'字符,并且使每行的字符串表示仍适合512字节的内存。


你听起来非常确定 - 你有引用吗?我在这个主题上找不到其他的东西。鉴于C99将字符串字面量和源代码行数的限制提高到4095,这使得这个选择似乎更加武断。或者至少,似乎其中两个选择(2^n-1或2^n-3)是武断的。 - mbauman
2
@MattB. - 没有引用 - 抱歉 :(. 这只是基于合理的猜测。也许到了C99时,人们意识到在每行的字符串表示中不需要存储任何CRLF字符 - 我恐怕还是在猜测。 - Digital Trauma

3
C11 dr 5.2.4.1的限制与OP给出的不同,我怀疑它们来自C89。
逻辑源行中最多有4095个字符。
字符串字面值中最多有4095个字符(在连接后)。
[编辑] @jwodder建议提供更完整的答案。
我能提供的最佳解释是:在80年代中期到90年代中期,512字节是软盘、磁盘和硬盘媒体最常见的扇区大小,很可能造成了509限制的奇怪情况,此外@bizzehdee和@DigitalTrauma的想法也有所贡献。
这是一个非常受欢迎的缓冲区大小。

1
这并没有解释为什么限制是它所代表的数字。 - jwodder
@jwodder 我同意答案没有解释为什么限制在24到14年前是509个字符。OP对于511或512这样的值没有问题,因此使用最新值似乎同样不会遇到4095的问题 - 因此当前值不需要解释。 - chux - Reinstate Monica
既然我们正在谈论内存块,那么终止符\r\n的假设就变得不那么相关了(如果您有一个有大小的块,则可以根据需要添加终止字符),但是您确实需要两个八位字节来描述数字[0, 512),并且您可能希望保留\0以便于C代码更好地使用空终止。 - mtraceur

2
直接来自于这个问题

也许509是为了允许一个512字节的缓冲区,其中两个字节用于"\r\n"行终止符,一个字节用于'\0'字符串终止符。


0
我没有源代码,但我认为这512个字符是由两个"字符和\0字符组成的。 我不认为这2个字符是用于CRLF的,有两个原因:这些不是您必须写入的默认字符,并且对于LINUX而言,它只有LF。这就是为什么我说是两个"字符的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接