2012-05-09 2 views
22

Qual è la lunghezza massima di una riga di codice sorgente tutti compilatori sono tenuti a accettare? È cambiato in C++ 11? Se sì, qual era il vecchio valore?Fonte limite di lunghezza linea

Sto facendo questa domanda perché sto facendo un voodoo del preprocessore pesante (sfortunatamente, i template non lo taglieranno), e così facendo ho la tendenza a rendere le linee grandi molto velocemente. Voglio stare dalla parte della sicurezza, quindi non dovrò preoccuparmi della possibilità del compilatore X sulla piattaforma Y di rifiutare il mio codice a causa di linee troppo lunghe.

+0

Preferirei verificare se esiste un modo per evitare il voodoo del preprocessore. È più probabile che dipendere da un dettaglio di implementazione –

+0

Non penserei che sarebbe difficile fare un compilatore C++ ad accettare lunghezze di linea infinite, ma non ne ho mai scritto uno. –

+0

@stefanbachert: Non posso evitarlo, questo è il problema. Inoltre, il punto della domanda è sapere dove inizia la terra definita dall'implementazione, in modo da evitare di vagabondarla. – Fanael

risposta

30

C++ 2003 Allegato B, (informativa) quantità di implementazione (mi dispiace, non hanno C++ 2011 a portata di mano)

2) I limiti possono limitare le quantità che comprendono quelli descritti sotto o altri. Il numero con parentesi successivo a ciascuna quantità è raccomandato come minimo per tale quantità. Tuttavia, queste quantità sono solo le linee guida e non determinano la conformità.

...

  • personaggi in una riga di codice sorgente logica [65 536].

Non avete chiesto su questi, ma potrebbe essere utile, anche:

  • Livelli di parentesi di espressioni tra parentesi all'interno di una piena espressione [256].
  • Identificatori di macro definiti simultaneamente in un'unità di traduzione [65 536].
  • Argomenti in una macro invocazione [256].
  • Numero di caratteri in un identificativo interno o nome macro [1 024].
  • Identificatori di macro definiti simultaneamente in un'unità di traduzione [65 536].
  • Parametri in una definizione macro [256].


Postscript: Vale la pena notare che cosa "una riga di codice sorgente logica" è. Una linea fonte logica è quello che hai dopo:

  • caratteri di file sorgente fisici sono mappati al carattere di base fonte impostare
  • Trigraph sequenze (2.3) sono sostituiti da corrispondenti rappresentazioni interne singolo carattere
  • Ogni istanza di un carattere new-line e un carattere rovesciato immediatamente precedente viene cancellato

La linea di source logico è quello di avere prima:

  • Il file sorgente viene scomposto in token pre-elaborazione
  • pre-elaborazione d le irettive vengono eseguite e le invocazioni macro vengono espanse.

[citazioni da C++ 2003 2.1 Fasi di traduzione]

Quindi, se la preoccupazione del PO è che le macro si espandono per oltre una lunghezza di riga ragionevole, la mia risposta è irrilevante. Se la preoccupazione dell'OP è che il suo codice sorgente (dopo aver trattato con \, \n) potrebbe essere troppo lungo, la mia risposta è valida.

+7

Giusto per confermare, questo è lo stesso in C++ 11. –

+3

+1: È il samne in C++ 11: "- Caratteri in una linea sorgente logica [65 536]." Allegato B.2 –

+0

Solo per dirlo: un compilatore può rifiutare (o fare qualsiasi altra cosa) un file contenente il solito codice "ciao mondo" a causa di linee troppo lunghe. Questo è un comportamento indefinito allora. Mi chiedo perché non hai una chiara risposta nella tua risposta sulle conseguenze della violazione del limite delle "linee lunghe" ... –