En concatenación de literales de cadena adyacentes

13

C y C ++ compilan literales de cadena adyacentes como un literal de cadena única. 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, esto es un error de sintaxis (que es perfectamente correcto, por cierto).

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

    
pregunta Krumia 01.09.2014 - 03:38

2 respuestas

16

El lenguaje C original se diseñó en 1969-1972 cuando la computación aún estaba dominada por la tarjeta perforada de 80 columnas. Sus diseñadores utilizaron dispositivos de 80 columnas como el Teletipo ASR-33. Estos dispositivos no envolvían 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 al 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 lograr que el compilador concatene adyacente cuerdas literales. Innumerables programadores de C estaban agradecidos por esa pequeña característica.

Una vez que la función está activada, ¿por qué se eliminará alguna vez? No causa pena y con frecuencia es útil. Yo, por un lado, más idiomas lo tenía. La tendencia moderna es tener cadenas extendidas con comillas triples u otros símbolos, pero la simplicidad de esta función en C nunca ha sido superada.

    
respondido por el david.pfx 01.09.2014 - 12:54
6

C no tiene un operador de concatenación de cadena 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 hay una sintaxis similar para describir la concatenación de cadenas que el compilador puede reconocer y precalcular. Así que los diseñadores de C décadas atrás eligieron eso

"a" "b"

significaría exactamente lo mismo que

"ab"

Naturalmente, C ++ heredó la misma convención. Mientras que la biblioteca estándar de C ++ sobrecarga + en std::string para significar concatenación de cadenas, el compilador no intenta unir co% c "a" + "b" porque eso es realmente un error (no se pueden agregar dos const char * punteros juntos).

    
respondido por el Greg Hewgill 01.09.2014 - 03:42

Lea otras preguntas en las etiquetas