Про об'єднання сусідніх літеральних рядків


17

C і C ++ компілює суміжні літеральні рядки як один рядковий літерал. Наприклад це:

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

еквівалентно:

"Some text...and more text"

В інших мовах сімейства C, таких як C # або Java, це синтаксична помилка (що є абсолютно відмінною BTW).

Яке обґрунтування / історична причина для C та C ++ робити це?

Відповіді:


24

Оригінальна мова С була розроблена в 1969-1972 роках, коли в обчислювальних технологіях досі переважали перфоровані 80 стовпчиками карти. Його дизайнери використовували 80 стовпчикових пристроїв, таких як ASR-33 Teletype. Ці пристрої автоматично не загортали текст, тому було справжнє стимул зберігати вихідний код у межах 80 стовпців. Фортран і Кобол мали чіткі механізми продовження, перш ніж вони нарешті перейшли до вільного формату.

Денніс Річі (я припускаю) це був штрих блиску, який зрозумів, що в граматиці немає двозначності і що довгі рядки ASCII можна зробити так, щоб вони вміщувались у 80 стовпців простим доцільним способом отримати компілятор для об'єднання сусідніх буквальних рядків. Незліченна кількість програмістів C були вдячні за цю маленьку функцію.

Після ввімкнення функції, чому б її коли-небудь видалити? Це не викликає горя і часто корисне. Я, на одне бажання, було більше мов. Сучасна тенденція - мати розширені рядки з потрійними лапками чи іншими символами, але простота цієї функції в С ніколи не була перевершена.


8
Ще одна причина полягає в тому, що вона дозволяє конкатенацію макросів препроцесора, визначених як рядкові літерали, наприклад, #define FOO "foo-value"після чого пізніше"FOO's value is " FOO "."
Blrfl

3
@Blrfl: Просто так. Важливо усвідомити, що конкатенація рядків відбувається після завершення заміни макросу.
david.pfx

7

C не має конкретного оператора конкатенації рядків ( +), такого як C # та Java. У C # або Java, коли компілятор бачить

"a" + "b"

він може скласти код точно так, як ніби

"ab"

були записані у вихідному коді. Однак у C не існує подібного простого синтаксису для опису конкатенації рядків, який компілятор може розпізнати та попередньо обчислити. Тож дизайнери C десятиліть тому обрали саме це

"a" "b"

означало б саме те саме

"ab"

Природно, що C ++ успадкував ту саму конвенцію. Хоча стандарт C ++ бібліотека перевантажує +на std::stringв середньому конкатенації, компілятор не намагається зливатися , "a" + "b"тому що насправді помилка (ви не можете додати два const char *покажчика разом).


1
C також не має конкретного типу рядка, замість цього вказуючи вказівники на символи в пам'яті. Ви не можете додати вказівники, і навіть якщо +вони якось позначаються конкатенацією, вам все одно доведеться вирішити проблему того, куди в пам'яті йде об'єднаний рядок.
Blrfl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.