我注意到,当将 std::string_view (或 std::string)分配给包含控制字符(例如 ' ' [标题开始])的字符数组时,gdb 将用八进制转义表示该 string_view已存在的控制字符和另一个特定字符之间的字符(在我的例子中为“=”)。
示例:
#include <array>
#include <iostream>
#include <string>
#include <string_view>
int main(int argc, char *argv[])
{
const std::array<char, 32> myArr =
{ '8', '=', 'F', 'I', 'X', 'T', '.', '1', '.', '1',
'\001', '9', '=', '9', '0', '\001', '3', '5', '=', 'A' };
const std::string_view view(myArr.begin(), myArr.size());
const std::string str (myArr.begin(), myArr.size());
std::cout << "VIEW: " << view << std::endl;
std::cout << "STRING: " << str << std::endl;
return 0;
}
使用 g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 编译,输出:
VIEW: 8=FIXT.1.19=9035=A
STRING: 8=FIXT.1.19=9035=A
查看 gdb 调试器中的
view
和 str
,我们看到:
"8=FIXT.1.1\001\071=90\001\063\065=A", '\000' <repeats 11 times>
我们可以看到,在第一次出现
'\001'
后,所有“键”值都是八进制转义的。
为什么会这样?
从数组中删除控制字符时,“转义转换”并未完成。但是,在实际示例中,数组必须包含控制字符。
我确实想指出,这不是问题,因为子字符串查找仍然工作得很好。
我只是想知道为什么 gdb 给我们这个表示。
想一想,如果 GDB 打印控制字符后面的数字时没有对其进行转义,会发生什么情况。它看起来像这样:
"8=FIXT.1.1\0019=90\00135=A", '\000' <repeats 11 times>
实际八进制转义序列的结尾将无法识别。因此,GDB 正在为您提供一项服务,它通过转义来告诉下一个字符从哪里开始。
如果在控制字符后面放置非数字,GDB 不需要转义它们,因为它们不会与转义序列混淆。