Я нашел этот относительно того, как препроцессор 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', ... }
В языке (C, а также C ++) нет «препроцессора». «Препроцессор», как отдельный функциональный блок, является деталью реализации. Способ обработки исходного файла (ов), если он определяется так называемыми фазами перевода . Одна из фаз в C, как и в C ++, включает конкатенацию строковых литералов.
В стандарте языка C ++ это описано в 2.1. Для C ++ (C ++ 03) это этап 6
6 Смежные обычные строковые литералы конкатенируются. Смежные широкие лексемы строковых литералов объединяются.
Да, это будет обработано так, как вы описали, потому что именно на этапе 5:
Каждый член исходного набора символов и управляющая последовательность в символьных константах и строковых литералов преобразуется в соответствующий член символьного набора выполнения (C99 §5.1.1.2/1)
Язык в C++03 фактически такой же:
Каждый член исходного набора символов, управляющая последовательность или универсальное имя символа в символьных и строковых литералах преобразуется в член исполняемого набора символов (C++03 §2.1/5)
Таким образом, управляющие последовательности (например, \0
) преобразуются в члены исполняемого набора символов на пятом этапе, перед конкатенацией строковых литералов на шестом этапе.
Из-за соглашения между стандартами C++ и C. Большинство, если не все, реализации C++ используют препроцессор C, так что да, C++ использует препроцессор C.