Concatenando letterali stringa adiacenti


17

C e C ++ compila i letterali stringa adiacenti come un letterale stringa singola. Ad esempio questo:

"Some text..." "and more text"

è equivalente a:

"Some text...and more text"

In altri linguaggi della famiglia C come C # o Java, questo è un errore di sintassi (che è perfettamente perfetto BTW).

Qual è la ragione logica / storica di C e C ++ per fare questo?

Risposte:


24

Il linguaggio C originale fu progettato nel 1969-1972 quando il calcolo era ancora dominato dalla scheda perforata a 80 colonne. I suoi progettisti hanno utilizzato 80 dispositivi a colonna come il Teletype ASR-33. Questi dispositivi non includevano automaticamente il testo, quindi c'era un vero incentivo a mantenere il codice sorgente all'interno di 80 colonne. Fortran e Cobol avevano espliciti meccanismi di continuazione per farlo, prima di passare infine al formato libero.

Dennis Ritchie (suppongo) fu un colpo di genialità rendersi conto che non c'era alcuna ambiguità nella grammatica e che lunghe stringhe ASCII potevano essere adattate in 80 colonne con il semplice espediente di far concatenare le stringhe letterali adiacenti al compilatore. Innumerevoli programmatori C erano grati per quella piccola funzione.

Una volta che la funzione è attiva, perché mai dovrebbe essere rimossa? Non provoca dolore ed è spesso utile. Per un certo desiderio, ce l'avevano più lingue. La tendenza moderna è quella di avere stringhe estese con virgolette triple o altri simboli, ma la semplicità di questa funzione in C non è mai stata superata.


8
Un altro motivo è che consente la concatenazione di macro preprocessore definite come valori letterali di stringa, ad esempio, #define FOO "foo-value"seguite in seguito da"FOO's value is " FOO "."
Blrfl

3
@Blrfl: Proprio così. È importante rendersi conto che la concatenazione di stringhe ha luogo al termine della sostituzione della macro.
david.pfx,

7

C non ha un operatore di concatenazione di stringhe specifico ( +) come C # e Java. In C # o Java, quando il compilatore vede

"a" + "b"

può compilare il codice esattamente come se

"ab"

sono stati scritti nel codice sorgente. In C, tuttavia, non esiste una sintassi altrettanto semplice per descrivere la concatenazione di stringhe che il compilatore può riconoscere e pre-calcolare. Quindi i designer di C decenni fa lo hanno scelto

"a" "b"

significherebbe esattamente la stessa cosa di

"ab"

Naturalmente il C ++ ha ereditato la stessa convenzione. Mentre il C ++ standard di sovraccarichi di libreria +su std::stringdi concatenazione di stringhe media, il compilatore non tenta di coalesce "a" + "b"perché questo è in realtà un errore (non è possibile aggiungere due const char *puntatori insieme).


1
C non ha inoltre un tipo di stringa specifico, optando invece per i puntatori ai caratteri in memoria. Non è possibile aggiungere puntatori e anche se in +qualche modo sono stati fatti per significare la concatenazione, è comunque necessario risolvere il problema di dove si trova la stringa concatenata in memoria.
Blrfl
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.