VS Intellisense显示了某些(不是全部)字节常数的逃脱字符



在Visual Studio c 中,我定义了一系列的通道ID恒定,其小数为0到15。该代码运行的嵌入式上下文。

悬停在这些常数之一上时,我希望Intellisense向我展示常数的数值。相反,它向我展示了角色表示。对于某些非打印值,它显示了一个代表某些ASCII值的逃脱字符,而对于其他值则显示了该字符的八分值。

const uint8_t channelID_Observations = 1;     // '01'
const uint8_t channelID_Events = 2;           // '02'
const uint8_t channelID_Wav = 3;              // '03'
const uint8_t channelID_FFT = 4;              // '04'
const uint8_t channelID_Details = 5;          // '05'
const uint8_t channelID_DebugData = 6;        // '06'
const uint8_t channelID_Plethysmography = 7;  // 'a'
const uint8_t channelID_Oximetry = 8;         // 'b'
const uint8_t channelID_Position = 9;         // ' ' ** this is displayed as a space between single quotes
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;      // '16'
const uint8_t channelID_AccelSnore = 15;      // '17'

某些ESC的代码很容易识别,并且十六进制或十进制等效物很容易记住(n == newline == 0x0A),但其他的更晦涩。例如,小数7显示为" a",在某些系统中代表ASCII BEL字符。

某些表示对我来说是神秘的 - 例如,十进制9将是ASCII选项卡,今天通常以" t"为" t",但是Intellisense将其显示为空格字符。

  1. 为什么无论我如何尝试将其定义为数字值,为什么8位未签名的整数总是被视为角色?

  2. 为什么只有一些,但不是所有这些字符作为其ASCII等效的逃脱符号,而其他人则获得了八分代表示?

  3. 使用的模糊符号的起源是什么?例如,小数7的" a"匹配ISO定义的Control0集,该集合具有Unicode表示形式 - 但是小数点应显示" t"。

  4. 有什么方法可以使IntelliSense Hover Tips向我展示此类常数的数值,而不是字符表示?装饰?vs设置?Typedefs?#defines?

您正在误读Intellisense。0x7 =' a'不是字面char'a'。' a'是铃铛/警报。

请参见有关逃生序列-https://en.wikipedia.org/wiki/escape_sequences_in_ctege/p>

'a'的文章。如果将0x07分配给uint8_t,则可以确保编译器不会将该分配更改为其他内容。IntelliSense仅以另一种方式表示值,它不会改变您的值。

另外, 'a'具有0x61的值,这可能就是绊倒您的原因。

一年多后,我决定记录我在进一步追求时发现的东西。djgandy的答案中暗示了正确的答案,该答案引用了Wikipedia,但我想明确。

除一个值(0x09(外,Intellisense似乎确实可以始终如一地处理这些值,并且该处理植根于权威来源:我的常数是"字符构成" 根据C11语言标准(第6.4.4节(。

对于不映射到可显示字符的字符常数,第6.4.4.4节将其语法定义为

6.4.4.4字符常数

语法

。。。

:: Simple-Escape-Sequence:

之一

'

"

??

\

a

b

f

n

r

t

v

:: octal-escape-sequence:

八分位数

八分位数八达数字

八位数八位数八分位数

在C语言定义第5.2.2节中进一步定义了"逃生序列":

§5.2.2字符显示语义

2(字母表逃脱序列表示代表非图字符 执行字符集旨在显示显示的动作 设备如下:

a (警报(产生听觉或可见警报 不改变主动位置。

b (Backpace(将活动位置移至上一个位置 当前线。如果主动位置在初始位置 线路,显示设备的行为未指定。

f (表格feed(将活动位置移至初始位置 下一个逻辑页面的开始。

n (新线路(将活动位置移至初始位置 下线。

r (电托返回(将活动位置移至初始位置 当前行。

t (水平标签(移动活动位置 到当前线上的下一个水平制表位置。如果是 主动位置在最后定义的水平制表处或超过 位置,未指定显示设备的行为。

v (垂直选项卡(将活动位置移至初始位置 下一个垂直制表位置。如果主动位置在或 过去定义的垂直制表位置, 显示设备未指定。

3(这些逃生序列中的每个 实现定义的值,可以存储在单个字符中 目的。文本文件中的外部表示不必 与内部表示形式相同,并且不在范围之外

的国际标准

因此,IntelliSense掉落的唯一位置是在0x09的处理中,应显示为

' t'

,但实际上显示为

''

那么这是什么呢?我怀疑Intellisense认为一个选项卡是可打印的字符,但以其格式抑制了Tab Action。在我看来,这与C和C 标准不一致,并且与其他逃生角色的处理也不一致,但是也许有一些理由可以"逃脱" Me:(

最新更新