C/C++:文字字符串中"\ xNNN"格式的固有歧义

sho*_*osh 8 c c++ string hex literals

考虑这两个字符串:

wchar_t* x = L"xy\x588xla";
wchar_t* y = L"xy\x588bla";
Run Code Online (Sandbox Code Playgroud)

阅读本文后,您会发现两个字符串文字除了一个字符外都是相同的 - 'x'而不是一个字符'b'.
事实证明事实并非如此.第一个字符串编译为:

y = {'x', 'y', 0x588,  'x', 'l', 'a' }
Run Code Online (Sandbox Code Playgroud)

第二个实际上是:

x = {'x', 'y', 0x588b, 'l', 'a' }
Run Code Online (Sandbox Code Playgroud)

它们的长度不一样!
是的,'b'十六进制表示('\xNNN')字符会占用它.

至少,这可能会导致手写字符串的混乱和微妙的错误(你可能会认为unicode字符串不属于代码体)

但是更严重的问题和我面临的问题是自动生成的代码.似乎没有任何方式来表达这一点:{'x', 'y', 0x588, 'b', 'l', 'a' }作为一个文字字符串,而不是以十六进制表示形式编写整个字符串,这是浪费和不可读的.

想办法解决这个问题吗?
语言表达的意义是什么?

Che*_*Alf 14

一种简单的方法是使用编译时字符串文字串联,因此:

wchar_t const* y = L"xy\x588" L"bla";
Run Code Online (Sandbox Code Playgroud)