我在C++中有一个(生成的)文字字符串,可能包含需要使用\x表示法转义的字符.例如:
char foo[] = "\xABEcho";
Run Code Online (Sandbox Code Playgroud)
但是,g ++(版本4.1.2,如果它很重要)会抛出一个错误:
test.cpp:1: error: hex escape sequence out of range
Run Code Online (Sandbox Code Playgroud)
编译器似乎将Ec字符视为前一个十六进制数字的一部分(因为它们看起来像十六进制数字).由于四位十六进制数不适合a char,因此会引发错误.显然,对于宽字符串文字L"\xABEcho",第一个字符是U + ABEC,其次是L"ho".
在过去的几十年里,这似乎发生了变化,我从未注意到.我几乎可以肯定旧的C编译器只会考虑两个十六进制数字\x,而不再看了.
我可以想到一个解决方法:
char foo[] = "\xAB""Echo";
Run Code Online (Sandbox Code Playgroud)
但那有点难看.所以我有三个问题:
这什么时候改变了?
为什么编译器只接受> 2位十六进制转义为宽字符串文字?
有没有比上述更难的解决方法?
如果在C中有字符串,则可以在其中添加直接十六进制代码.
char str[] = "abcde"; // 'a', 'b', 'c', 'd', 'e', 0x00
char str2[] = "abc\x12\x34"; // 'a', 'b', 'c', 0x12, 0x34, 0x00
Run Code Online (Sandbox Code Playgroud)
两个示例在内存中都有6个字节.现在,如果要[a-fA-F0-9]在十六进制输入后添加值,则存在问题.
//I want: 'a', 'b', 'c', 0x12, 'e', 0x00
//Error, hex is too big because last e is treated as part of hex thus becoming 0x12e
char problem[] = "abc\x12e";
Run Code Online (Sandbox Code Playgroud)
可能的解决方案是在定义后替换.
//This will work, bad idea
char solution[6] = "abcde";
solution[3] = 0x12;
Run Code Online (Sandbox Code Playgroud)
这可以工作,但如果你把它作为,它将失败const.
//This will not work
const char solution[6] = "abcde"; …Run Code Online (Sandbox Code Playgroud) 在字符串文字中,如何使用可以解释为十六进制数字的文字字符立即跟随十六进制转义序列?例如,如果我写这个文字......
"BlahBlah\x04BlahBlah"
Run Code Online (Sandbox Code Playgroud)
... 'B'紧接着'4'将被解释为十六进制转义的一部分,因为它是一个有效的十六进制数字.
我如何编写一个字符串文字,表示如果将
'4'其作为十字转义的最后一个字符,上面将表示的字符串?