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

Posted

技术标签:

【中文标题】C/C++:文字字符串中“\\xNNN”格式的固有歧义【英文标题】:C/C++: Inherent ambiguity of "\xNNN" format in literal stringsC/C++:文字字符串中“\xNNN”格式的固有歧义 【发布时间】:2013-03-03 12:53:10 【问题描述】:

考虑这两个字符串:

wchar_t* x = L"xy\x588xla";
wchar_t* y = L"xy\x588bla";

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

y = 'x', 'y', 0x588,  'x', 'l', 'a' 

第二个其实是:

x = 'x', 'y', 0x588b, 'l', 'a' 

它们的长度甚至都不一样! 是的,'b' 被十六进制表示 ('\xNNN') 字符吞噬了。

至少,这可能会导致手写字符串的混乱和细微错误(您可能会争辩说 unicode 字符串不属于代码主体)

但更严重的问题,也是我面临的问题,是自动生成的代码。似乎没有任何方法可以表达这一点:'x', 'y', 0x588, 'b', 'l', 'a' 作为文字字符串,而无需将整个字符串写入十六进制表示,这是浪费且不可读的。

有什么办法解决这个问题吗? 这种行为的语言有什么意义?

【问题讨论】:

哎呀,刚刚在 C 中遇到了这个问题。幸运的是 VS2013 编译器警告我,我的十六进制字符值超出了 'char' 范围。 【参考方案1】:

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

wchar_t const* y = L"xy\x588" L"bla";

【讨论】:

以上是关于C/C++:文字字符串中“\xNNN”格式的固有歧义的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 字符串替换中的子匹配组引用是不是有分隔符/消歧语法?

C/C++,你能#include一个文件到一个字符串文字中吗? [复制]

C中字符串文字的“生命周期”

NLP中的消歧方法

python的循環之二

python的循環之二