О конкатенации смежных строковых литералов


17

C и C ++ компилируют смежные строковые литералы как единый строковый литерал. Например это:

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

эквивалентно:

"Some text...and more text"

В других языках семейства C, таких как C # или Java, это синтаксическая ошибка (что совершенно нормально, кстати).

Каково обоснование / историческая причина для C и C ++, чтобы сделать это?

Ответы:


24

Оригинальный язык C был разработан в 1969-1972 годах, когда в компьютерных технологиях все еще доминировала перфокарта с 80 столбцами. Его разработчики использовали 80 колонных устройств, таких как телетайп ASR-33. Эти устройства не переносили текст автоматически, поэтому существовал стимул хранить исходный код в пределах 80 столбцов. У Фортрана и Кобола были явные механизмы продолжения, прежде чем они наконец перешли в свободный формат.

Деннис Ритчи (как я полагаю) понял, что в грамматике не было никакой двусмысленности и что длинные строки ASCII можно было бы вписать в 80 столбцов простым способом заставить компилятор объединить смежные буквенные строки. Бесчисленные программисты на Си были благодарны за эту маленькую особенность.

Как только функция будет включена, почему она будет удалена? Это не вызывает горя и часто удобно. У меня для одного желания больше языков было это. Современная тенденция состоит в том, чтобы иметь расширенные строки с тройными кавычками или другими символами, но простота этой функции в Си никогда не была превзойдена.


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 десятилетия назад выбрали это

"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.