VS Intellisense显示某些(不是全部)字节常量的转义字符

时间:2017-04-18 08:46:02

标签: c++ c teensy

在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;         // ' ' ** 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;      // '\016'
const uint8_t channelID_AccelSnore = 15;      // '\017'

很容易识别某些转义代码,并且很容易记住十六进制或十进制等值(\n == newline == 0x0A),但其他代码更加模糊。例如,十进制7显示为' \ a',在某些系统中表示ASCII BEL字符。

有些表示对我来说很神秘 - 例如,十进制9将是一个ASCII标签,现在通常显示为' \ t',但智能感知将其显示为空格字符。

  1. 为什么8位无符号整数始终被视为一个字符,无论我如何将其定义为数值?

  2. 为什么只有部分字符,但并非所有这些字符都显示为ASCII等价字符的转义符号,而其他字符则是八进制代码?

  3. 使用的晦涩符号的来源是什么?例如,' \ a'对于十进制7,匹配ISO定义的Control0集,它具有unicode表示 - 但是然后' \ t'应显示小数点9. Wikipedia C0 control codes

  4. 有没有办法让intellisense悬停提示向我展示这些常量的数值而不是字符表示?装饰? VS设置?类型定义? #定义

3 个答案:

答案 0 :(得分:3)

你误读了intellisense。 0x7 =' \ a'不是文字字母' a'。 ' \ A'是钟/闹钟。

请参阅以下有关转义序列的文章 - https://en.wikipedia.org/wiki/Escape_sequences_in_C

答案 1 :(得分:2)

'\a'确实具有值0x7。如果将0x07分配给uint8_t,则可以非常确定编译器不会将该分配更改为其他内容。 IntelliSense只是以另一种方式表示价值,它不会改变您的价值。

此外,'a'的值为0x61,这可能会使你绊倒。

答案 2 :(得分:0)

一年多后,我决定记录我进一步研究时发现的内容。正确的答案暗示在djgandy的答案中,该答案引用了Wikipedia,但我想使其明确。

除了一个值(0x09)之外,Intellisense的确似乎始终如一地对待这些值,并且这种处理源于权威来源:我的常量是无符号8位常量,因此是根据C11语言标准(第6.4.4节)的“字符常量”

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

  

6.4.4.4字符常量

     

语法

     

。 。

     

:: simple-escape-sequence:

之一      

\'

     

\“

     

\?

     

\\

     

\ a

     

\ b

     

\ f

     

\ n

     

\ r

     

\ t

     

\ v

     

::八进制转义序列:

     

\八位数字

     

\八位数字八位数字

     

\八进制数字八进制数字八进制数字

在C语言定义部分5.2.2中进一步定义了“转义序列”:

  

§5.2.2字符显示语义

     

2)表示英文中非图形字符的字母转义序列   执行字符集旨在产生显示的动作   设备如下:

     

\ a (警报),产生听觉或视觉警报   而不更改活动位置。

     

\ b (退格键)将活动位置移动到上一个位置   当前行。如果活动位置位于的初始位置   一条线,显示设备的行为是不确定的。

     

\ f (换页)将活动位置移动到初始位置   下一个逻辑页面的开始。

     

\ n (新行)将有效位置移动到广告订单的初始位置   下一行。

     

\ r (回车)将有效位置移动到初始位置   当前行的

     

\ t (水平标签)移动活动位置   到当前行的下一个水平列表位置。如果   有效位置位于或超过最后定义的水平列表   位置,显示设备的行为未指定。

     

\ v (垂直标签),将有效位置移动到   下一个垂直列表位置。如果有效位置在或   超过最后定义的垂直列表位置时,   显示设备未指定。

     

3)这些转义序列中的每一个都应产生唯一的   实现定义的值,可以存储在单个char中   宾语。文本文件中的外部表示形式不需要   与内部表示相同,并且不在范围内   该国际标准。

因此Intellisense跌倒的唯一地方是处理0x09,它应显示为

  

'\ t'

但实际上显示为

  

''

那是什么一回事?我怀疑Intellisense认为标签页是可打印的字符,但是会抑制其格式中的标签页动作。在我看来,这与C和C ++标准不一致,也与对其他转义字符的处理不一致,但是也许有某种理由“逃脱”我:)