Является ли int x = 'fooo' расширением компилятора? - PullRequest
4 голосов
/ 31 марта 2009

Я видел и использовал код C ++, подобный следующему:

int myFourcc = 'ABCD';

Он работает в последних версиях GCC, не уверен, насколько свежим. Эта функция в стандарте? Как это называется?

У меня возникли проблемы с поиском в Интернете ...

EDIT:

Я нашел эту информацию и для будущих наблюдателей:

из gcc документация

Компилятор определяет многосимвольную символьную константу символ за раз, сдвигая предыдущее значение влево на количество битов на целевой символ, а затем изменяя битовый массив нового символа, усеченного до ширины. целевого персонажа. Конечный битовый шаблон имеет тип int и, следовательно, является подписанным независимо от того, подписаны ли отдельные символы или нет (небольшое изменение по сравнению с версиями 3.1 и более ранними версиями GCC). Если в константе больше символов, чем уместилось бы в цели int, компилятор выдает предупреждение, а лишние начальные символы игнорируются.

Например, 'ab' для цели с 8-битным символом будет интерпретироваться как (int) ((unsigned char) 'a' * 256 + (unsigned char) 'b')', and '\234a' as (int) ((unsigned char) '\ 234' * 256 + (unsigned char) 'a') '.

Ответы [ 5 ]

7 голосов
/ 31 марта 2009

См. Раздел 6.4.4.4, пункт 10 стандарта C99:

Целочисленная символьная константа имеет тип int. Значение целочисленной символьной константы содержащий один символ, который отображается на однобайтовый символ выполнения Числовое значение представления сопоставленного символа интерпретируется как целое число. Значение целочисленной символьной константы, содержащей более одного символа (например, 'ab') или содержит символ или escape-последовательность, которая не отображается в однобайтовый символ выполнения, определяется реализацией. Если целочисленная символьная константа содержит одиночный символ или escape-последовательность, его значение является тем, которое получается, когда объект с тип char, значение которого равно значению одиночного символа или escape-последовательности, преобразуется в тип int.

Напомним, что определенный реализацией означает, что реализация (в данном случае компилятор C) может делать все, что захочет, но это должно быть документировано .

Большинство компиляторов преобразуют его в целочисленную константу, соответствующую конкатенации октетов, соответствующих отдельным символам, но порядковый номер может быть как младшим, так и старшим, в зависимости от порядкового номера целевой архитектуры.

Следовательно, переносимый код не должен использовать многосимвольные константы, а вместо этого должен использовать простые интегральные константы. Вместо 'abcd', который может иметь либо порядковый номер, используйте либо 0x61626364, либо 0x64636261, которые имеют известные порядковые номера (большой и маленький соответственно).

6 голосов
/ 31 марта 2009

"Обратите внимание, что в соответствии со стандартом C не существует ограничений на длину символьной константы, но значение символьной константы, содержащей более одного символа, определяется реализацией. Последние версии GCC предоставляют поддержку многобайтовой символьные константы и вместо ошибки генерируются предупреждения многосимвольная символьная константа или предупреждение: в этом случае символьная константа слишком длинная для ее типа . "

5 голосов
/ 31 марта 2009

C ++ стандартная версия говорит:

Символьный литерал - это один или несколько символов, заключенных в один кавычки, как в 'х'

и

Обычный символьный литерал, содержащий более одного символа c-char, является литералом с несколькими символами. Мультикар литерал acter имеет тип int и значение, определяемое реализацией .

1 голос
/ 31 марта 2009

Да, это стандарт, но определяется реализацией.

На практике это представляет собой 32-разрядное целое число, которое вы получаете путем объединения байтов 'A', 'B', 'C' и 'D'.

0 голосов
/ 31 марта 2009

Если кого-то интересует конкретный приведенный пример, это идентификатор формата хранения данных.
Очень полезно иметь удобочитаемое значение константы, например «XVID», а не просто 1234. Стоит подумать, когда вы составляете произвольные целочисленные ключи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...