在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',但智能感知将其显示为空格字符。
为什么8位无符号整数始终被视为一个字符,无论我如何将其定义为数值?
为什么只有部分字符,但并非所有这些字符都显示为ASCII等价字符的转义符号,而其他字符则是八进制代码?
使用的晦涩符号的来源是什么?例如,' \ a'对于十进制7,匹配ISO定义的Control0集,它具有unicode表示 - 但是然后' \ t'应显示小数点9. Wikipedia C0 control codes
有没有办法让intellisense悬停提示向我展示这些常量的数值而不是字符表示?装饰? VS设置?类型定义? #定义
答案 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 ++标准不一致,也与对其他转义字符的处理不一致,但是也许有某种理由“逃脱”我:)