Sur la concaténation des littéraux de chaîne adjacents

17

C et C ++ compile les littéraux de chaîne adjacents comme un littéral de chaîne unique. Par exemple ceci:

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

est équivalent à:

"Some text...and more text"

Dans d'autres langages de la famille C comme C # ou Java, il s'agit d'une erreur de syntaxe (ce qui est parfaitement bien BTW).

Quelle est la raison / la raison historique pour laquelle C et C ++ font cela?

sampathsris
la source

Réponses:

24

Le langage C d'origine a été conçu en 1969-1972 lorsque l'informatique était encore dominée par la carte perforée à 80 colonnes. Ses concepteurs ont utilisé 80 appareils à colonnes tels que le télétype ASR-33. Ces appareils n'encapsulaient pas automatiquement le texte, il y avait donc une réelle incitation à garder le code source dans 80 colonnes. Fortran et Cobol disposaient de mécanismes de continuation explicites pour le faire, avant de finalement passer au format libre.

Ce fut un coup d'éclat pour Dennis Ritchie (je suppose) de réaliser qu'il n'y avait pas d'ambiguïté dans la grammaire et que de longues chaînes ASCII pouvaient être faites pour tenir dans 80 colonnes par le simple moyen d'obtenir du compilateur qu'il concatène les chaînes littérales adjacentes. D'innombrables programmeurs C étaient reconnaissants pour cette petite fonctionnalité.

Une fois la fonctionnalité activée, pourquoi serait-elle supprimée? Il ne cause aucun chagrin et est souvent pratique. Pour ma part, j'aimerais que plus de langues l'aient. La tendance moderne est d'avoir des chaînes étendues avec des guillemets triples ou d'autres symboles, mais la simplicité de cette fonctionnalité en C n'a jamais été surpassée.

david.pfx
la source
8
Une autre raison est qu'il permet la concaténation des macros de préprocesseur définies comme des littéraux de chaîne, par exemple, #define FOO "foo-value"suivies plus tard par"FOO's value is " FOO "."
Blrfl
3
@Blrfl: Exactement. Il est important de réaliser que la concaténation de chaînes a lieu une fois la substitution de macros terminée.
david.pfx
7

C n'a pas d'opérateur de concaténation de chaîne spécifique ( +) comme C # et Java. En C # ou Java, lorsque le compilateur voit

"a" + "b"

il peut compiler le code exactement comme si

"ab"

ont été écrits dans le code source. En C, cependant, il n'y a pas de syntaxe aussi simple pour décrire la concaténation de chaînes que le compilateur peut reconnaître et précalculer. Donc, les concepteurs de C il y a des décennies ont choisi cela

"a" "b"

signifierait exactement la même chose que

"ab"

Naturellement, C ++ a hérité de la même convention. Bien que la norme C ++ Surcharges bibliothèque +sur std::stringla concaténation de chaîne moyenne, le compilateur ne cherche pas à fusionner "a" + "b"parce que c'est en fait une erreur (vous ne pouvez pas ajouter deux const char *pointeurs ensemble).

Greg Hewgill
la source
1
C n'a également aucun type de chaîne spécifique, optant plutôt pour les pointeurs vers les caractères en mémoire. Vous ne pouvez pas ajouter de pointeurs, et même si cela +signifiait en quelque sorte la concaténation, vous devez toujours résoudre le problème de l'emplacement en mémoire de la chaîne concaténée.
Blrfl