Visual Studio 调试器中C++的格式说明符

可以使用格式说明符更改在 “监视”、“自动”和 “局部变量”窗口中显示的值的格式。

还可以在 “即时 ”窗口中、 命令 窗口、 跟踪点甚至源窗口中使用格式说明符。 如果在这些窗口中的某个表达式上暂停,结果会显示在 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 监视窗口的屏幕截图中,选择了一行,展示 my_var1 的值为 101 'e',类型为 int。

可以通过在 “监视” 窗口中的值后附加逗号 (,)来查看和选择可用的格式说明符列表。

WatchFormatSpecDropdown

格式说明符

下表描述了可在 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元组的数组。