C ++ препроцессор конкатенации строк - PullRequest
6 голосов
/ 15 мая 2010

Я нашел это относительно того, как препроцессор 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', ... }

Ответы [ 3 ]

10 голосов
/ 15 мая 2010

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

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

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

6 голосов
/ 15 мая 2010

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

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

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

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

Итак, escape-последовательности (например, \0) преобразуются в члены набора символов выполнения на пятом этапе, прежде чем строковые литералы объединяются на шестом этапе.

0 голосов
/ 15 мая 2010

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

...