2013-10-14 10 views
16

Ho visto molti dei requisiti minimi che un compilatore C ANSI deve supportare come 31 argomenti per una funzione e la maggior parte dei numeri sembra avere un qualche senso.Razionale per limite minimo di caratteri 509

Tuttavia, non riesco a vedere il ragionamento per il supporto di almeno 509 caratteri in una riga di origine. 511 o 512 avrebbero più senso, ma 509 sembra un po 'arbitrario.

Qual è il motivo di questo numero?

+5

Vedere anche: http://stackoverflow.com/questions/11488616/why-is-max-length-of-c-string-literal-different-from-max-char. Mentre la domanda in sé non è un duplicato, alcune delle risposte e dei commenti ci sono. –

+0

@Ryan Haining, alcuni di questi requisiti del compilatore "ANSI C" relativi a 509 dai compilatori realizzati negli ultimi 10 anni? – chux

+1

@Ryan Haining: "ANSI C" risale al 1989. Dato lo stato dei computer in quella data (1 meg in un pc stava finalmente diventando non-raro), si può immaginare la lotta tra scrittori di compilatori che conservano la memoria e standard C che dichiarare un minimo assoluto di qualche tipo per ogni parametro. Lo standard di una coppia CR/LF è una spiegazione perfettamente valida. 4095 ... Dovrei controllare il mio codice ma non penso di aver mai voluto superare quel minimo di 509 caratteri. – usr2564301

risposta

16

Questo è forse per tener conto di possibili CR + LF + '\0' caratteri, avere una rappresentazione di stringa di ogni linea inserirsi ancora in 512 byte di memoria.

+0

Sembri molto sicuro - hai una citazione? Non riesco a trovare nient'altro sull'argomento. Dato che C99 ha innalzato i limiti per stringhe letterali e linee di origine a 4095, rende questa scelta più arbitraria. O almeno, sembra che una delle due scelte (2^n-1 o 2^n-3) sia arbitraria. –

+1

@MattB. - nessuna citazione - scusa :(.Questo è solo basato su congetture istruite. Forse quando C99 è arrivato, si è reso conto che non è necessario memorizzare alcun carattere 'CR' o' LF' in una rappresentazione in stringa di ogni riga - Ho più paura. –

2

retta dalla this question

Forse 509 è destinato a consentire un buffer di 512 byte con due byte per un "\ r \ n" terminatore di linea e una per un '\ 0' terminatore di stringa.

3

Il C11 dr 5.2.4.1 limiti sono diverso in OP. Sospetto che vengano dalla C89. era necessario

4095 caratteri in una riga di codice sorgente logica

4095 caratteri di una stringa letterale (dopo la concatenazione)


[EDIT] @jwodder suggerito una risposta più completa.

migliore posso fornire: 512 bytes è stata la dimensione del settore più comune per i floppy, dischetti e supporti disco rigido circa la metà 80 a metà degli anni '90 e probabilmente hanno contribuito, insieme a @bizzehdee & @DigitalTrauma pensieri come al 509 limite di curiosi.

Era una dimensione del buffer molto popolare.

+1

Questo non spiega nulla * perché * il limite è il numero che è. – jwodder

+0

@jwodder Sono d'accordo, la risposta non spiega perché il limite era di 509 caratteri da 24 a 14 anni fa. L'OP non ha avuto problemi con valori come 511 o 512 e quindi utilizzando valori aggiornati apparentemente non avrebbe avuto alcun problema con 4095 - e quindi nessuna spiegazione era necessaria per i valori correnti. – chux

0

Non ho alcuna fonte, ma ho pensato che fossero i due caratteri " e il carattere \ 0 che compongono questi 512 caratteri. Non penso che i 2 caratteri siano per CRLF per 2 motivi: questi non sono caratteri di default che devi scrivere lì, e per LINUX è solo LF. Ecco perché dico che sono i due caratteri ".

Problemi correlati