Как работает конкатенация двух строковых литералов?

19
char* a="dsa" "qwe";
printf("%s",a);

вывод: dsaqwe

Мой вопрос, почему эта вещь работает. Если я даю пробел или ничего между двумя строковыми литералами, он конкатенирует строковые литералы.

Как это работает?

    
задан grv 25.08.2012 в 11:53
источник
  • Пожалуйста, поставьте что-то реальное в вопросе названия. Я отредактировал это для вас, посмотрите, подходит ли он. –  Jens Gustedt 25.08.2012 в 12:00

5 ответов

24

Он определяется стандартом ISO C, смежные строковые литералы объединяются в один.

Язык немного сух (это стандартный стандарт), но раздел 6.4.5 String literals из C11:

  

В фазе 6 перевода многосимвольные последовательности символов, заданные любой последовательностью   смежный символ и тождественно-префиксы с широким строковым литералом объединяются в   одна многобайтовая последовательность символов.

Это также упоминается в 5.1.1.2 Translation phases, point 6 , немного более лаконично:

  

Смежные строковые литералы объединяются.

В основном это означает, что "abc" "def" не отличается от "abcdef" .

Это часто полезно для создания длинных строк при хорошем форматировании:

char *myString = "This is a really long "
                 "string and I don't want "
                 "to make my lines in the "
                 "editor too long, because "
                 "I'm basically anal retentive :-)";
    
ответ дан paxdiablo 25.08.2012 в 11:58
источник
  • Ничего плохого в том, чтобы быть пристальным для деталей. –  Aaron Hall♦ 23.05.2014 в 19:23
6

Вы ответили на свой вопрос.

  

Если я даю пробел или ничего между двумя строковыми литералами, он конкатенирует строковые литералы.

Это одна из особенностей синтаксиса C.

    
ответ дан Joe 25.08.2012 в 11:54
источник
3

И чтобы ответить на ваш непрошенный вопрос: «Для чего это полезно?»

С одной стороны, вы можете поместить константы в строковые литералы. Вы можете написать

#define FIRST "John"
#define LAST "Doe"

const char* name = FIRST " " LAST;
const char* salutation = "Dear " FIRST ",";

, а затем, если вам нужно будет изменить имя позже, вам нужно будет только изменить его в одном месте.
Такие вещи.

    
ответ дан Mr Lister 25.08.2012 в 13:01
источник
1

Стандарт ISO C §5.1.1.2 говорит: -

  
  1. Связанные токены строковых литералов конкатенированы.
  2.   
  3. Символы белого пространства, разделяющие токены, уже не являются значимыми.
  4.   
    
ответ дан perilbrain 25.08.2012 в 12:02
источник
  • На самом деле, это вторая фаза активности, выполняемая после объединения смежных строковых литералов в фазе 6. Смежный в этом смысле означает, что в любом случае игнорировать пустое пространство. Однако +1 для первого. –  paxdiablo 25.08.2012 в 12:13
-4

Я уверен, что это компилятор.

    
ответ дан a_a_t 25.08.2012 в 11:55
источник
  • не функция компилятора, это стандарт ISO. –  Seçkin Savaşçı 25.08.2012 в 12:00
  • ... и как таковой он встроен в компилятор. Так что это функция компилятора. –  a_a_t 25.08.2012 в 15:49
  • , см. принятый ответ. И никого не вводите в заблуждение. Вы должны немного прочитать о компиляторах и проверить свою терминологию. –  Seçkin Savaşçı 25.08.2012 в 15:57
  • Я прочитал ответ, и я думаю, что мы оба правы. Это, действительно, стандарт ИСО и, как таковой, для каждого компилятора обязательно придерживается этого стандарта для его реализации. Я буду называть это «встроенным компилятором» вместо «функции компилятора», если эта терминология более подходит. –  a_a_t 25.08.2012 в 19:44