VS Intellisense показывает экранированные символы для некоторых (не всех) констант байтов

В Visual Studio C ++ я определил серию констант channelID с десятичными значениями от 0 до 15. Я сделал их типа uint8_t по причинам, связанным с тем, как они используются во встроенном контексте, в котором выполняется этот код.

При наведении курсора на одну из этих констант я бы хотел, чтобы intellisense показывал мне числовое значение константы. Вместо этого он показывает мне представление персонажа. Для некоторых непечатаемых значений отображается экранированный символ, представляющий некоторое значение ASCII, а для других — экранированное восьмеричное значение для этого символа.

const uint8_t channelID_Observations = 1;     // '\001'
const uint8_t channelID_Events = 2;           // '\002'
const uint8_t channelID_Wav = 3;              // '\003'
const uint8_t channelID_FFT = 4;              // '\004'
const uint8_t channelID_Details = 5;          // '\005'
const uint8_t channelID_DebugData = 6;        // '\006'
const uint8_t channelID_Plethysmography = 7;  // '\a'
const uint8_t channelID_Oximetry = 8;         // 'b'
const uint8_t channelID_Position = 9;         // ''
const uint8_t channelID_Excursion = 10;       // '\n'
const uint8_t channelID_Motion = 11;          // '\v'
const uint8_t channelID_Env = 12;             // '\f'
const uint8_t channelID_Cmd = 13;             // '\r'
const uint8_t channelID_AudioSnore = 14;      // '\016'
const uint8_t channelID_AccelSnore = 15;      // '\017'

Некоторые экранированные коды легко распознаются, а шестнадцатеричные или десятичные эквиваленты легко запоминаются. (\n == newline == 0x0A) но другие более неясны. Например, десятичное число 7 отображается как ‘\ a’, что в некоторых системах представляет символ ASCII BEL.

Некоторые из представлений загадочны для меня — например, десятичная цифра 9 будет вкладкой ASCII, которая сегодня часто отображается как ‘\ t’, но intellisense показывает ее как символ пробела.

  1. Почему 8-разрядное целое число без знака всегда рассматривается как символ, независимо от того, как я пытаюсь определить его как числовое значение?

  2. Почему только некоторые, но не все эти символы отображаются как экранированные символы для их эквивалентов ASCII, в то время как другие получают восьмеричное представление?

  3. Каково происхождение используемых неясных символов? Например, «\ a» для десятичного числа 7 соответствует определенному ISO-образу набору Control0, который имеет представление в кодировке Unicode, но тогда «\ t» должно быть показано для десятичного числа 9. Википедия C0 контрольные коды

  4. Есть ли способ заставить подсказки intellisense при наведении указывать мне числовое значение таких констант, а не символьное представление? Украшение? Настройки VS? Определения типов? #defines?

Специальный запрос: Если вы отрицаете этот вопрос, не могли бы вы оставить комментарий, почему?

-2

Решение

Вы неправильно читаете интеллигентность. 0x7 = ‘\ a’ не буквальный символ ‘a’. «\ а» — это звонок / тревога.

Смотрите следующую статью о escape-последовательностях — https://en.wikipedia.org/wiki/Escape_sequences_in_C

3

Другие решения

'\a' действительно имеет значение 0x7. Если вы назначите 0x07 к uint8_t, вы можете быть уверены, что компилятор не изменит это назначение на что-то другое. IntelliSense просто представляет значение по-другому, оно не меняет ваши значения.

Также, 'a' имеет значение 0x61, это то, что, вероятно, сбило вас с толку.

2

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

За исключением одного значения (0x09), Intellisense, по-видимому, обрабатывает эти значения последовательно, и эта обработка основана на авторитетном источнике: мои константы 8-битные константы без знака, таким образом они «символьные константы» в соответствии с языковым стандартом C11 (раздел 6.4.4).

Для символьных констант, которые не отображаются на отображаемый символ, раздел 6.4.4.4 определяет их синтаксис как

6.4.4.4 Символьные константы

Синтаксис

. . .

:: simple-escape-sequence: один из

\?

\\

\ а

\ б

\ е

\ п

\ т

\ v

:: восьмеричной-спусковая последовательность:

восьмеричная цифра

восьмеричная цифра восьмеричная цифра

восьмеричное восьмеричное восьмеричное

«Escape-последовательности» дополнительно определены в разделе 5.2.2 определения языка C:

§5.2.2 Семантика отображения символов

2) Буквенные escape-последовательности, представляющие неграфические символы в
набор символов выполнения предназначен для создания действий на дисплее
устройства следующим образом:

\ а (оповещение) Создает звуковое или видимое оповещение
без изменения активной позиции.

\ б (Backspace) Перемещает активную позицию на предыдущую позицию на
текущая строка. Если активная позиция находится в начальной позиции
линия, поведение устройства отображения не определено.

\ е (подача формы) Перемещает активную позицию в начальную позицию в
начало следующей логической страницы.

\ п (новая строка) Перемещает активную позицию в начальную позицию
следующая строка

(возврат каретки) Перемещает активную позицию в исходную позицию
текущей строки.

\ т (горизонтальная вкладка) Перемещает активную позицию
к следующей горизонтальной позиции табуляции в текущей строке. Если
активная позиция находится в или после последней определенной горизонтальной табуляции
положение, поведение устройства отображения не определено.

\ v (вертикальная вкладка) Перемещает активную позицию в начальную позицию
следующая вертикальная позиция табуляции. Если активная позиция в или
мимо последней определенной вертикальной позиции табуляции, поведение
устройство отображения не указано.

3) Каждая из этих escape-последовательностей должна создавать уникальный
определенное реализацией значение, которое может храниться в одном символе
объект. Внешние представления в текстовом файле не должны быть
идентичны внутренним представлениям и находятся вне области видимости
настоящего международного стандарта.

Таким образом, единственное место, где Intellisense падает, — обработка 0x09, которая должна отображаться как

«\ Т»

но на самом деле отображается как

«»

Так о чем это все? Я подозреваю, что Intellisense считает вкладку печатным символом, но подавляет действие вкладки при ее форматировании. Это кажется мне несовместимым со стандартами C и C ++, а также несовместимо с его обработкой других escape-символов, но, возможно, есть какое-то оправдание тому, что «избегает» меня 🙂

0
По вопросам рекламы [email protected]