частичная инициализация строки C

В каком-то коде, который я сегодня прочитал, существовал новый для меня тип инициализации C-String.

Он объединяет несколько String-Initialization, таких как ABC...

Это также позволяет разделить инициализацию строки на несколько строк.

Я создал небольшую демонстрацию Hello World, чтобы вы могли видеть, о чем я говорю:

#include <stdio.h>

#define SPACE " "
#define EXCLAMATION_MARK "!"
#define HW "Hello"SPACE"World"EXCLAMATION_MARK

int main()
{
  char hw_str[] =
  "Hello"
  SPACE
  "World"
  "!";

  printf("%s\n",hw_str);
  printf("%s\n",HW);
  return 0;
}

Итак, вот несколько вопросов:

  • это действительно по стандарту?
  • почему это работает? abc похож на массив {'a','b','c'}, верно? Так почему же инициализация массива объединяется в несколько рабочих пар?
  • имеет ли эта функция официальное название - например, когда вы вводите ее в Google, вы находите документацию, описывающую ее?
  • это портативное?

person schnedan    schedule 14.07.2021    source источник


Ответы (1)


Из стандарта C (5.1.1.2 Этапы трансляции)

1 Приоритет синтаксических правил перевода определяется следующими фазами.

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

Так, например, эта часть программы

char hw_str[] =
  "Hello"
  SPACE
  "World"
  "!";

что после макроподстановок выглядит так

char hw_str[] =
  "Hello"
  " "
  "World"
  "!";

обрабатывается препроцессором на шестом этапе путем объединения соседних строковых литералов, и у вас есть

char hw_str[] =
  "Hello World!";
person Vlad from Moscow    schedule 14.07.2021
comment
как только я ввел фразу Смежный строковый литерал, я нашел softwareengineering .stackexchange.com/questions/254984/ , что также является хорошим намеком на эту функцию. - person schnedan; 14.07.2021