Concatenando literais de string adjacentes

17

C e C ++ compilam literais de string adjacentes como um único literal de string. Por exemplo, isto:

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

é equivalente a:

"Some text...and more text"

Em outras linguagens da família C, como C # ou Java, esse é um erro de sintaxe (que é perfeitamente correto).

Qual é a razão lógica / histórica para C e C ++ fazer isso?

sampathsris
fonte

Respostas:

24

A linguagem C original foi projetada em 1969-1972, quando a computação ainda era dominada pelo cartão perfurado de 80 colunas. Seus projetistas usaram 80 dispositivos de coluna, como o Teletype ASR-33. Esses dispositivos não agrupavam automaticamente o texto, portanto havia um incentivo real para manter o código-fonte dentro de 80 colunas. Fortran e Cobol tinham mecanismos explícitos de continuação para fazê-lo, antes de finalmente mudarem para o formato livre.

Foi um golpe de brilhantismo para Dennis Ritchie (suponho) perceber que não havia ambiguidade na gramática e que longas seqüências ASCII podiam ser ajustadas em 80 colunas pelo simples expediente de fazer o compilador concatenar seqüências literais adjacentes. Inúmeros programadores C ficaram gratos por esse pequeno recurso.

Depois que o recurso é inserido, por que ele seria removido? Não causa tristeza e é frequentemente útil. Eu, pelo menos, gostaria de ter mais idiomas. A tendência moderna é ter seqüências estendidas com aspas triplas ou outros símbolos, mas a simplicidade desse recurso em C nunca foi superada.

david.pfx
fonte
8
Outro motivo é que ele permite a concatenação de macros de pré-processador definidas como literais de seqüência de caracteres, por exemplo, #define FOO "foo-value"seguidas posteriormente por"FOO's value is " FOO "."
Blrfl 4/15
3
@Blrfl: Apenas isso. É importante perceber que a concatenação de cadeias ocorre após a substituição da macro.
David.pfx
7

C não possui um operador de concatenação de string específico ( +) como C # e Java. Em C # ou Java, quando o compilador vê

"a" + "b"

ele pode compilar o código exatamente como se

"ab"

foram escritos no código fonte. Em C, no entanto, não há sintaxe igualmente fácil para descrever a concatenação de seqüências de caracteres que o compilador pode reconhecer e pré-calcular. Então, os designers de C décadas atrás escolheram que

"a" "b"

significaria exatamente a mesma coisa que

"ab"

Naturalmente, o C ++ herdou a mesma convenção. Enquanto o padrão C ++ sobrecargas biblioteca +sobre std::stringa concatenação média corda, o compilador não tenta coalesce "a" + "b"porque isso é realmente um erro (você não pode adicionar dois const char *ponteiros juntos).

Greg Hewgill
fonte
1
C também não possui um tipo de sequência específico, optando por ponteiros para caracteres na memória. Você não pode adicionar ponteiros e, mesmo que de +alguma forma signifique concatenação, ainda precisa resolver o problema de onde fica a memória da seqüência concatenada.
Blrfl