可以使用格式说明符更改在 “监视”、“自动”和 “局部变量”窗口中显示的值的格式。
还可以在 “即时 ”窗口中、 命令 窗口、 跟踪点甚至源窗口中使用格式说明符。 如果在这些窗口中的某个表达式上暂停,结果会显示在 DataTip 中。 DataTip 显示会根据格式说明符进行调整。
注释
当 Visual Studio 本机调试器更改为新的调试引擎时,会添加一些新的格式说明符,并删除了一些旧格式说明符。 使用 C++/CLI 执行互作(混合本机和托管)调试时,仍会使用较旧的调试器。
设置格式说明符
我们将使用以下示例代码:
int main() {
int my_var1 = 0x0065;
int my_var2 = 0x0066;
int my_var3 = 0x0067;
}
在调试时将 my_var1 变量添加到 “监视 ”窗口, 调试>Windows>Watch>1。 接下来,右键单击变量并选择 “十六进制显示”。 现在, “监视 ”窗口会显示值0x0065。 若要查看此值表示为字符而不是整数,请首先右键单击并取消选择 十六进制显示。 然后,在变量名称之后的 Name 列中添加字符格式说明符 c。
“值”列现在显示 101 个“e”。
可以通过在 “监视” 窗口中的值后附加逗号 (,)来查看和选择可用的格式说明符列表。
格式说明符
下表描述了可在 Visual Studio 中使用的格式说明符。 粗体说明符仅支持新调试器,而不支持使用 C++/CLI 进行互作调试。
| 说明符 | Format | 原始监视值 | 显示的值 |
|---|---|---|---|
| d | 十进制整数 | 0x00000066 | 102 |
| o | 无符号八进制整数 | 0x00000066 | 000000000146 |
| x h |
十六进制整数 | 102 | 0xcccccccc |
| X H |
十六进制整数 | 102 | 0xCCCCCCCC |
| xb hb |
十六进制整数 (不带前导 0x) | 102 | cccccc |
| Xb Hb |
十六进制整数 (不带前导 0x) | 102 | CCCCCCCC |
| b | 无符号二进制整数 | 二十五 | 0b00000000000000000000000000011001 |
| bb | 无符号二进制整数(不含前导 0b) | 二十五 | 00000000000000000000000000011001 |
| e | 科学记数法 | 25000000 | 2.500000e+07 |
| 克 | 更短的科学点或浮点 | 25000000 | 2.5e+07 |
| c | 单个字符 | 0x0065 | 101 “e” |
| s | const char* 字符串(带引号) | <位置> “你好,世界” | “hello world” |
| 某人 | const char* 字符串 (无引号) | <位置> "hello world" | 世界您好 |
| s8 | UTF-8 字符串 | <位置> “这是 UTF-8 咖啡杯 - ̃•” | “这是一个 UTF-8 咖啡杯☕” |
| s8b | UTF-8 字符串(无引号) | <位置> "hello world" | 世界您好 |
| su | Unicode (UTF-16 编码) 字符串(带引号) | <location> L“你好,世界” | L“hello world” u“hello world” |
| 子项 | Unicode (UTF-16 编码) 字符串 (无引号) | <location> L“hello world” | 世界您好 |
| bstr | BSTR 二进制字符串(带引号) | <location> L“hello world” | L“hello world” |
| env | 环境块(双空字符终止字符串) | <location> L"=::=::\\" | L"=::=::\\\0=C:=C:\\windows\\system32\0ALLUSERSPROFILE=... |
| s32 | UTF-32 字符串(带引号) | <location> U“hello world” | U“hello world” |
| s32b | UTF-32 字符串(无引号) | <location> U“hello world” | 世界您好 |
| en | 枚举 | 星期六(6) | Saturday |
| 高压 | 指针类型 - 指示所检查的指针值是数组的堆分配的结果,例如 new int[3]。 |
<位置>{<first member>} | <location>{<第一个成员>,<第二个成员>,...} |
| na | 隐藏指向对象的指针的内存地址。 | <location>, {member=value...} | {member=value...} |
| nd | 仅显示基类信息,忽略派生类 |
(Shape*) square 包括基类和派生类信息 |
仅显示基类信息 |
| 小时 | HRESULT 或 Win32 错误代码。 HRESULT 不再需要此说明符,因为调试器会自动对其进行解码。 | S_OK | S_OK |
| 廁所 | 窗口类标志 | 0x0010 | WC_DEFAULTCHAR |
| wm | Windows 消息编号 | 16 | WM_CLOSE |
| 星期日 | 取消“原始视图”项 | ||
| nvo | 仅对数值显示“原始视图”项 | ||
| ! | 原始格式,忽略任何数据类型视图自定义 | <自定义表示形式> | 4 |
| 句柄 | 显示 win32 句柄的相关信息 | 0x000000000000009c | 显示有关句柄的有用信息,例如线程 ID 等。 |
注释
当 存在 hv 格式说明符时,调试器将尝试确定缓冲区的长度并显示该数量的元素。 由于调试器并不总是能够找到数组的确切缓冲区大小,因此应尽可能使用大小说明符 (pBuffer,[bufferSize]) 。 当缓冲区大小不可用时, hv 格式说明符非常有用。
作为数组的指针大小说明符
如果有指向要作为数组查看的对象的指针,则可以使用整数或表达式来指定数组元素的数目。
| 说明符 | Format | 原始监视值 | 显示的值 |
|---|---|---|---|
| n | 十进制或 十六进制 整数 | pBuffer,[32] pBuffer,[0x20] |
显示为 pBuffer 32 个元素数组。 |
| [exp] | 计算结果为整数的有效C++表达式。 | pBuffer,[bufferSize] | 将 pBuffer 显示为元素数组 bufferSize 。 |
| expand(n) | 计算结果为整数的有效C++表达式 | pBuffer, expand(2) | 显示pBuffer的第三个元素 |
使用 C++/CLI 进行互操作调试的格式说明符
| 说明符 | Format | 原始监视值 | 显示的值 |
|---|---|---|---|
| o | 无符号八进制整数 | 0xF065 | 0170145 |
| x X |
十六进制整数 | 61541 | 0x0000f065 |
| c | 单个字符 | <位置> | 101 “e” |
| s | const char* (带引号) | <位置> | “hello world” |
| su | const wchar_t* const char16_t* (带引号) |
<位置> | L“hello world” |
| 子项 | const wchar_t* const char16_t* |
<位置> | 世界您好 |
| s8 | const char* (带引号) | <位置> | “hello world” |
| 小时 | HRESULT 或 Win32 错误代码。 HRESULT 不再需要此说明符,因为调试器会自动对其进行解码。 |
S_OK | S_OK |
| 廁所 | 窗口类标志 | 0x00000040, | WC_DEFAULTCHAR |
| wm | Windows 消息编号 | 0x0010 | WM_CLOSE |
| ! | 原始格式,忽略任何数据类型视图自定义 | <自定义表示形式> | 4 |
d、e、f、g、h、i、l、m、ma、mb、md、mq、mu、mw、u 说明符对于本机和 C++/CLI 代码需使用已弃用的调试器,而 Visual Studio 2022 或更高版本不支持该调试器。
粗 体 说明符仅支持用于调试本机代码和C++/CLI 代码。 这些说明符需要使用 托管兼容性模式指定的旧调试器。
| 说明符 | Format | 原始监视值 | 显示的值 |
|---|---|---|---|
|
d i |
带符号十进制整数 | 0xF000F065 | -268373915 |
| u | 无符号十进制整数 | 0x0065 | 101 |
| o | 无符号八进制整数 | 0xF065 | 0170145 |
| x X |
十六进制整数 | 61541 | 0x0000f065 |
|
l h |
长前缀或短前缀:d、i、u、o、x、X | 00406042 | 0x0c22 |
| f | 带符号浮点 | (3./2.),f | 1.500000 |
| e | 带符号的科学表示法 | (3.0/2.0) | 1.500000e+000 |
| g | 有符号浮点或有符号科学表示法, 以较短者为准 |
(3.0/2.0) | 1.5 |
| c | 单个字符 | <位置> | 101 “e” |
| s | const char* (带引号) | <位置> | “hello world” |
| su | const wchar_t* const char16_t* (带引号) |
<位置> | L“hello world” |
| 子项 | const wchar_t* const char16_t* |
<位置> | 世界您好 |
| s8 | const char* (带引号) | <位置> | “hello world” |
| 小时 | HRESULT 或 Win32 错误代码。 HRESULT 不再需要此说明符,因为调试器会自动对其进行解码。 |
S_OK | S_OK |
| 廁所 | 窗口类标志 | 0x00000040, | WC_DEFAULTCHAR |
| wm | Windows 消息编号 | 0x0010 | WM_CLOSE |
| ! | 原始格式,忽略任何数据类型视图自定义 | <自定义表示形式> | 4 |
使用 C++/CLI 在互操作调试中为内存位置设置格式化说明符
下表描述了用于内存位置的格式符号。 可以将内存位置说明符与任何用作位置的值或表达式一起使用。
粗 体 说明符仅支持用于调试本机代码和C++/CLI 代码。 这需要使用 托管兼容性模式指定的旧调试器。
| 符号 | Format | 原始监视值 | 显示的值 |
|---|---|---|---|
| ma | 64 个 ASCII 字符 | 0x0012ffac | 0x0012ffac .4...0..."..0W&.......1W&.0.:W..1...."..1.JO&.1.2.."...1...0y....1 |
| m | 十六进制中的 16 个字节,后跟 16 个 ASCII 字符 | 0x0012ffac | 0x0012ffac B3 34 CB 00 84 30 94 80 FF 22 8A 30 57 26 00 00 .4...0...".0W&.. |
| mb | 十六进制中的 16 个字节,后跟 16 个 ASCII 字符 | 0x0012ffac | 0x0012ffac B3 34 CB 00 84 30 94 80 FF 22 8A 30 57 26 00 00 .4...0...".0W&.. |
| mw | 8 个单词 | 0x0012ffac | 0x0012ffac 34B3 00CB 3084 8094 22FF 308A 2657 0000 |
| md | 4 个双字 | 0x0012ffac | 0x0012ffac 00CB34B3 80943084 308A22FF 00002657 |
| mq | 2 个四字 | 0x0012ffac | 0x0012ffac 7ffdf00000000000 5f441a790012fdd4 |
| μ | 2 字节字符 (Unicode) | 0x0012ffac | 0x0012ffac 8478 77f4 ffff ffff 0000 0000 0000 0000 |
使用 C++/CLI 在互操作调试中将指针的大小说明符作为数组使用
如果有指向要作为数组查看的对象的指针,则可以使用整数来指定数组元素的数目。
| 说明符 | Format | Expression | 显示的值 |
|---|---|---|---|
| n | 十进制整数 | pBuffer[32] | 将 pBuffer 显示为一个32元组的数组。 |