8

次の 2 つの文字列を考えてみましょう。

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

'x'これを読むと、両方の文字列リテラルが 1 文字( a ではなくan ) を除いて同じであることが予想されます'b'
そうではないことがわかりました。最初の文字列は次のようにコンパイルされます。

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

2番目は実際には次のとおりです。

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

彼らは同じ長さではありません!
はい、 16 進表現 ( ) 文字'b'によって食い尽くされます。'\xNNN'

少なくとも、これは手書きの文字列で混乱と微妙なバグを引き起こす可能性があります (Unicode 文字列はコード本体に属していないと主張できます)。

しかし、私が直面しているより深刻な問題は、自動生成されたコードにあります。これを表現する方法はないようです:{'x', 'y', 0x588, 'b', 'l', 'a' }文字列全体を 16 進表現で記述することに頼らずにリテラル文字列として表現する方法はありません。

これを回避する方法はありますか?
このように振る舞う言語の意味は何ですか?

4

1 に答える 1

14

簡単な方法は、コンパイル時の文字列リテラル連結を使用することです。

wchar_t const* y = L"xy\x588" L"bla";
于 2013-03-14T22:54:19.563 に答える