Al concatenar literales de cadena adyacentes

17

C y C ++ compilan literales de cadena adyacentes como un literal de cadena único. Por ejemplo esto:

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

es equivalente a:

"Some text...and more text"

En otros lenguajes de la familia C como C # o Java, este es un error de sintaxis (que está perfectamente bien, por cierto).

¿Cuál es la razón lógica / histórica para que C y C ++ hagan esto?

sampathsris
fuente

Respuestas:

24

El lenguaje C original fue diseñado en 1969-1972 cuando la informática todavía estaba dominada por la tarjeta perforada de 80 columnas. Sus diseñadores utilizaron 80 dispositivos de columna, como el teletipo ASR-33. Estos dispositivos no ajustaban automáticamente el texto, por lo que había un incentivo real para mantener el código fuente dentro de 80 columnas. Fortran y Cobol tenían mecanismos de continuación explícitos para hacerlo, antes de que finalmente pasaran a formato libre.

Fue un golpe de brillantez para Dennis Ritchie (supongo) darse cuenta de que no había ambigüedad en la gramática y que las largas cadenas ASCII podían encajar en 80 columnas por el simple recurso de hacer que el compilador concatene las cadenas literales adyacentes. Innumerables programadores de C estaban agradecidos por esa pequeña característica.

Una vez que la característica está activada, ¿por qué alguna vez se eliminará? No causa dolor y con frecuencia es útil. Por mi parte, deseo que más idiomas lo tuvieran. La tendencia moderna es tener cadenas extendidas con comillas triples u otros símbolos, pero la simplicidad de esta característica en C nunca ha sido superada.

david.pfx
fuente
8
Otra razón es que permite la concatenación de macros de preprocesador definidas como literales de cadena, por ejemplo, #define FOO "foo-value"seguidas más tarde"FOO's value is " FOO "."
Blrfl
3
@Blrfl: Solo así. Es importante darse cuenta de que la concatenación de cadenas tiene lugar después de que se completa la sustitución de macros.
david.pfx
7

C no tiene un operador de concatenación de cadenas específico ( +) como C # y Java. En C # o Java, cuando el compilador ve

"a" + "b"

puede compilar el código exactamente como si

"ab"

fueron escritos en el código fuente. En C, sin embargo, no existe una sintaxis similar para describir la concatenación de cadenas que el compilador puede reconocer y calcular previamente. Entonces, los diseñadores de C hace décadas eligieron eso

"a" "b"

significaría exactamente lo mismo que

"ab"

Naturalmente, C ++ heredó la misma convención. Mientras que el C ++ estándar sobrecargas de la biblioteca +en std::stringque la concatenación de cadena media, el compilador no intenta se unen "a" + "b", ya que es en realidad un error (no se puede agregar dos const char *punteros juntos).

Greg Hewgill
fuente
1
C tampoco tiene un tipo de cadena específico, optando por punteros a caracteres en la memoria. No puede agregar punteros, e incluso si de +alguna manera se hizo que significan concatenación, todavía tiene que resolver el problema de dónde va la cadena concatenada en la memoria.
Blrfl