2013-03-14 15 views
8

Considerare questi due stringhe:C/C++: ambiguità di formato " xnnn" nelle stringhe letterali

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

dopo aver letto questo che ci si aspetta che entrambe le stringhe letterali sono gli stessi, tranne un personaggio - un 'x' invece di un 'b'.
Si scopre che questo non è il caso. La prima stringa compila a:

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

e il secondo è in realtà:

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

Non sono nemmeno la stessa lunghezza!
Sì, lo 'b' viene divorato dal carattere di rappresentazione esadecimale ('\xNNN').

Per lo meno, questo potrebbe causare confusione e bug sottili per nelle stringhe scritte a mano (si potrebbe sostenere che le stringhe Unicode non appartengono nel corpo del codice)

Ma il problema più grave, e la quello che sto affrontando è nel codice generato automaticamente. Non sembra esserci alcun modo per esprimere questo: {'x', 'y', 0x588, 'b', 'l', 'a' } come stringa letterale senza ricorrere a scrivere l'intera stringa in una rappresentazione esadecimale, che è dispendiosa e illeggibile.

Qualche idea di un modo per aggirare questo?
Qual è il senso nel linguaggio che si comporta in questo modo?

+0

Ahi, appena eseguito in questo in C. Per fortuna il compilatore VS2013 mi ha avvertito che il mio valore di carattere esadecimale era al di fuori del 'char' gamma. – Spike0xff

risposta

14

Un modo semplice è quello di utilizzare tempo di compilazione concatenazione di stringhe letterali, in tal modo:

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