Конкатенация строкового литерала Препроцессора C++

Я нашел этот относительно того, как препроцессор C должен обработать конкатенацию строкового литерала (фаза 6). Однако я ничего не могу найти относительно того, как это обрабатывается в C++ (C++ использует препроцессор C?).

Причина, которую я спрашиваю, состоит в том, что у меня есть следующее:

const char * Foo::encoding = "\0" "1234567890\0abcdefg";

где encoding статический член класса Foo. Без доступности конкатенации я не смог бы записать что последовательность символов как этот.

const char * Foo::encoding = "\01234567890\0abcdefg";

Что-то совершенно различное из-за пути \012 интерпретируется.

У меня нет доступа к нескольким платформам, и мне любопытно, насколько уверенный я должен быть то, что вышеупомянутое всегда обрабатывается правильно - т.е. Я буду всегда добираться { 0, '1', '2', '3', ... }

6
задан Community 23 May 2017 в 12:07
поделиться

3 ответа

В языке (C, а также C ++) нет «препроцессора». «Препроцессор», как отдельный функциональный блок, является деталью реализации. Способ обработки исходного файла (ов), если он определяется так называемыми фазами перевода . Одна из фаз в C, как и в C ++, включает конкатенацию строковых литералов.

В стандарте языка C ++ это описано в 2.1. Для C ++ (C ++ 03) это этап 6

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

10
ответ дан 8 December 2019 в 14:41
поделиться

Да, это будет обработано так, как вы описали, потому что именно на этапе 5:

Каждый член исходного набора символов и управляющая последовательность в символьных константах и строковых литералов преобразуется в соответствующий член символьного набора выполнения (C99 §5.1.1.2/1)

Язык в C++03 фактически такой же:

Каждый член исходного набора символов, управляющая последовательность или универсальное имя символа в символьных и строковых литералах преобразуется в член исполняемого набора символов (C++03 §2.1/5)

Таким образом, управляющие последовательности (например, \0) преобразуются в члены исполняемого набора символов на пятом этапе, перед конкатенацией строковых литералов на шестом этапе.

6
ответ дан 8 December 2019 в 14:41
поделиться

Из-за соглашения между стандартами C++ и C. Большинство, если не все, реализации C++ используют препроцессор C, так что да, C++ использует препроцессор C.

0
ответ дан 8 December 2019 в 14:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: