Как использовать двоичный префикс в соответствии с C11? - PullRequest
7 голосов
/ 26 января 2012

Я сейчас начинаю программировать микроконтроллеры, используя C30 (компилятор C на основе GCC из микрочипа для их PIC24 устройств), и я включил Strict ANSI warnings из любопытства.Во-первых, я не знал, что в C11 маркировка комментариев типа // «неправильна», и вместо этого я должен использовать / * бла-бла * /, но что действительно удивило меня, так это предупреждение для строки кода.

«Предупреждение: использование нестандартного двоичного префикса»

Строка кода:

OSCCONbits.COSC = 0b000;

Я посмотрел онлайн на одном из проектов C11(ISO / IEC 9899: 2011) и не может найти ничего о двоичных префиксах в C. http://www.open -std.org / jtc1 / sc22 / wg14 / www / docs / n1570.pdf

Какова правильная двоичная запись для C согласно C11?

Ответы [ 4 ]

18 голосов
/ 26 января 2012

C не имеет двоичных констант. (Даже в C11 они не поддерживаются.)

Они были предложены как дополнение к С99, но предложение было отклонено.

Из документа обоснования C99:

Предложение добавить двоичные константы было отклонено из-за отсутствия прецедента и недостаточной полезности.

Вы сказали, что используете компилятор на основе gcc, а gcc поддерживает двоичные константы: они являются расширением GNU для языка C.

Целочисленные константы могут быть записаны в виде двоичных констант, состоящих из последовательности цифр 0 и 1, с префиксом 0b или 0B. Это особенно полезно в средах, которые много работают на битовом уровне (например, микроконтроллеры).

См. gcc страницу о двоичных константах для получения дополнительной информации:

http://gcc.gnu.org/onlinedocs/gcc/Binary-constants.html

3 голосов
/ 26 января 2012

Относительно стандартов:

  • ANSI C / "Строгий ANSI" обычно относится к первой стандартной версии C, стандартизированной только в США 1989 г. Иногда ее называют "C89".
  • ANSI C / 89 устарел в 1990 году, когда C стал международным стандартом C, ISO / IEC 9899: 1990, именуемым "C90".C89 и C90 эквивалентны, когда дело касается технических деталей.
  • C90 устарел в 1999 году, когда был обновлен ISO C.Новый стандарт упоминается как «C99».
  • C99 устарел в 2011 году. Новый стандарт упоминается как «C11».

Относительно ваших проблем с компилятором:

  • C89 / C90 не позволяет // комментировать.Они были введены в C99.Они не были удалены в C11.
  • Двоичная запись никогда не была частью какого-либо стандарта C.

Заключение:

  • Скорее всего, вы компилируетекод на компиляторе C90 с некоторыми нестандартными расширениями.
3 голосов
/ 26 января 2012

C11 не имеет двоичных литералов;он имеет только десятичные, восьмеричные и шестнадцатеричные числа, как описано в разделе 6.4.4.1 стандарта.Это не отличается от C99.

6.6, параграф 10 гласит:

Реализация может принимать другие формы константных выражений.

, которые, если я понимаюэто правильно, разрешает тип расширения, которое обеспечивает ваш компилятор;это также не отличается от C99.

Обычный обходной путь - использование шестнадцатеричных литералов;каждая шестнадцатеричная цифра соответствует четырем двоичным цифрам.(И, конечно, 0b000 можно записать просто как 0.)

1 голос
/ 26 января 2012

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

Кроме того, // комментарии были введены в стандарте C99, их нет в стандарте C89 ANSI. Вот почему ваш компилятор выдает предупреждение.

...