VS Intellisense 显示一些(不是全部)字节常量的转义字符
VS Intellisense shows escaped characters for some (not all) byte constants
在 Visual Studio C++ 中,我定义了一系列 channelID 常量,十进制值为 0 到 15。我将它们设为 uint8_t 类型,原因与它们的使用方式有关在运行此代码的嵌入式上下文中。
当鼠标悬停在其中一个常量上时,我希望智能感知显示常量的数值。相反,它向我展示了字符表示。对于某些非打印值,它显示一个表示某个 ASCII 值的转义字符,而对于其他值,它显示该字符的一个转义八进制值。
const uint8_t channelID_Observations = 1; // '[=10=]1'
const uint8_t channelID_Events = 2; // '[=10=]2'
const uint8_t channelID_Wav = 3; // '[=10=]3'
const uint8_t channelID_FFT = 4; // '[=10=]4'
const uint8_t channelID_Details = 5; // '[=10=]5'
const uint8_t channelID_DebugData = 6; // '[=10=]6'
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; // '6'
const uint8_t channelID_AccelSnore = 15; // '7'
一些转义代码很容易识别,十六进制或十进制等价物很容易记住 (\n == newline == 0x0A)
,但其他的则比较模糊。例如,十进制 7 显示为“\a”,在某些系统中它代表 ASCII BEL 字符。
有些表示法让我感到困惑——例如十进制 9 将是一个 ASCII 制表符,现在通常显示为“\t”,但智能感知将其显示为 space 字符。
为什么 8 位无符号整数总是被视为字符,无论我如何尝试将其定义为数值?
为什么只有部分而非所有这些字符显示为其 ASCII 等价物的转义符号,而其他字符显示为八进制表示?
所使用的晦涩符号的来源是什么?例如,十进制 7 的 '\a' 与 ISO 定义的 Control0 集匹配,它具有 unicode 表示形式——但是 '\t' 应该显示为十进制 9。Wikipedia C0 control codes
有没有办法让智能感知悬停提示向我显示此类常量的数值而不是字符表示?装饰? VS 设置?类型定义? #定义?
'\a'
确实有值 0x7。如果您将 0x07
分配给 uint8_t
,您可以非常确定编译器不会将该分配更改为其他内容。 IntelliSense 只是以另一种方式表示值,它不会改变您的值。
此外,'a'
的值为 0x61,这可能让您感到困惑。
你误读了智能感知。 0x7 = '\a' 不是文字字符 'a'。 '\a'是铃声/闹钟。
请参阅以下有关转义序列的文章 - https://en.wikipedia.org/wiki/Escape_sequences_in_C
一年多后,我决定记录下我进一步研究时的发现。 djgandy 的答案中暗示了正确答案,该答案引用了维基百科,但我想明确说明。
除了一个值 (0x09) 之外,Intellisense 似乎确实一致地处理这些值,并且这种处理方式源于权威来源:我的常量是 无符号 8 位常量,因此根据 C11 语言标准(第 6.4.4 节),它们是 "character-constants"。
对于不映射到可显示字符的字符常量,第 6.4.4.4 节将它们的语法定义为
6.4.4.4 Character constants
Syntax
. . .
::simple-escape-sequence: one of
\'
\"
\?
\
\a
\b
\f
\n
\r
\t
\v
::octal-escape-sequence:
\ octal-digit
\ octal-digit octal-digit
\ octal-digit octal-digit octal-digit
"Escape Sequences"在C语言定义5.2.2节进一步定义:
§5.2.2 Character display semantics
2) Alphabetic escape sequences representing nongraphic characters in
the execution character set are intended to produce actions on display
devices as follows:
\a (alert) Produces an audible or visible alert
without changing the active position.
\b (backspace) Moves the active position to the previous position on
the current line. If the active position is at the initial position of
a line, the behavior of the display device is unspecified.
\f ( form feed) Moves the active position to the initial position at
the start of the next logical page.
\n (new line) Moves the active position to the initial position of the
next line.
\r (carriage return) Moves the active position to the initial position
of the current line.
\t (horizontal tab) Moves the active position
to the next horizontal tabulation position on the current line. If the
active position is at or past the last defined horizontal tabulation
position, the behavior of the display device is unspecified.
\v (vertical tab) Moves the active position to the initial position of
the next vertical tabulation position. If the active position is at or
past the last defined vertical tabulation position, the behavior of
the display device is unspecified.
3) Each of these escape sequences shall produce a unique
implementation-defined value which can be stored in a single char
object. The external representations in a text file need not be
identical to the internal representations, and are outside the scope
of this International Standard.
因此,Intellisense 唯一失败的地方是对 0x09 的处理,应该显示为
'\t'
但实际显示为
''
那到底是怎么回事?我怀疑 Intellisense 将制表符视为可打印字符,但在其格式中抑制了制表符操作。在我看来,这似乎与 C 和 C++ 标准不一致,也与其对其他转义字符的处理不一致,但也许有一些理由 "escapes" 我 :)
在 Visual Studio C++ 中,我定义了一系列 channelID 常量,十进制值为 0 到 15。我将它们设为 uint8_t 类型,原因与它们的使用方式有关在运行此代码的嵌入式上下文中。
当鼠标悬停在其中一个常量上时,我希望智能感知显示常量的数值。相反,它向我展示了字符表示。对于某些非打印值,它显示一个表示某个 ASCII 值的转义字符,而对于其他值,它显示该字符的一个转义八进制值。
const uint8_t channelID_Observations = 1; // '[=10=]1'
const uint8_t channelID_Events = 2; // '[=10=]2'
const uint8_t channelID_Wav = 3; // '[=10=]3'
const uint8_t channelID_FFT = 4; // '[=10=]4'
const uint8_t channelID_Details = 5; // '[=10=]5'
const uint8_t channelID_DebugData = 6; // '[=10=]6'
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; // '6'
const uint8_t channelID_AccelSnore = 15; // '7'
一些转义代码很容易识别,十六进制或十进制等价物很容易记住 (\n == newline == 0x0A)
,但其他的则比较模糊。例如,十进制 7 显示为“\a”,在某些系统中它代表 ASCII BEL 字符。
有些表示法让我感到困惑——例如十进制 9 将是一个 ASCII 制表符,现在通常显示为“\t”,但智能感知将其显示为 space 字符。
为什么 8 位无符号整数总是被视为字符,无论我如何尝试将其定义为数值?
为什么只有部分而非所有这些字符显示为其 ASCII 等价物的转义符号,而其他字符显示为八进制表示?
所使用的晦涩符号的来源是什么?例如,十进制 7 的 '\a' 与 ISO 定义的 Control0 集匹配,它具有 unicode 表示形式——但是 '\t' 应该显示为十进制 9。Wikipedia C0 control codes
有没有办法让智能感知悬停提示向我显示此类常量的数值而不是字符表示?装饰? VS 设置?类型定义? #定义?
'\a'
确实有值 0x7。如果您将 0x07
分配给 uint8_t
,您可以非常确定编译器不会将该分配更改为其他内容。 IntelliSense 只是以另一种方式表示值,它不会改变您的值。
此外,'a'
的值为 0x61,这可能让您感到困惑。
你误读了智能感知。 0x7 = '\a' 不是文字字符 'a'。 '\a'是铃声/闹钟。
请参阅以下有关转义序列的文章 - https://en.wikipedia.org/wiki/Escape_sequences_in_C
一年多后,我决定记录下我进一步研究时的发现。 djgandy 的答案中暗示了正确答案,该答案引用了维基百科,但我想明确说明。
除了一个值 (0x09) 之外,Intellisense 似乎确实一致地处理这些值,并且这种处理方式源于权威来源:我的常量是 无符号 8 位常量,因此根据 C11 语言标准(第 6.4.4 节),它们是 "character-constants"。
对于不映射到可显示字符的字符常量,第 6.4.4.4 节将它们的语法定义为
6.4.4.4 Character constants
Syntax
. . .
::simple-escape-sequence: one of
\'
\"
\?
\
\a
\b
\f
\n
\r
\t
\v
::octal-escape-sequence:
\ octal-digit
\ octal-digit octal-digit
\ octal-digit octal-digit octal-digit
"Escape Sequences"在C语言定义5.2.2节进一步定义:
§5.2.2 Character display semantics
2) Alphabetic escape sequences representing nongraphic characters in the execution character set are intended to produce actions on display devices as follows:
\a (alert) Produces an audible or visible alert without changing the active position.
\b (backspace) Moves the active position to the previous position on the current line. If the active position is at the initial position of a line, the behavior of the display device is unspecified.
\f ( form feed) Moves the active position to the initial position at the start of the next logical page.
\n (new line) Moves the active position to the initial position of the next line.
\r (carriage return) Moves the active position to the initial position of the current line.
\t (horizontal tab) Moves the active position to the next horizontal tabulation position on the current line. If the active position is at or past the last defined horizontal tabulation position, the behavior of the display device is unspecified.
\v (vertical tab) Moves the active position to the initial position of the next vertical tabulation position. If the active position is at or past the last defined vertical tabulation position, the behavior of the display device is unspecified.
3) Each of these escape sequences shall produce a unique implementation-defined value which can be stored in a single char object. The external representations in a text file need not be identical to the internal representations, and are outside the scope of this International Standard.
因此,Intellisense 唯一失败的地方是对 0x09 的处理,应该显示为
'\t'
但实际显示为
''
那到底是怎么回事?我怀疑 Intellisense 将制表符视为可打印字符,但在其格式中抑制了制表符操作。在我看来,这似乎与 C 和 C++ 标准不一致,也与其对其他转义字符的处理不一致,但也许有一些理由 "escapes" 我 :)