2013-03-14 29 views
8

Hãy xem xét hai chuỗi này:C/C++: nhập nhằng vốn có định dạng " xNNN" trong chuỗi chữ

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

Sau khi đọc bài viết này bạn sẽ hy vọng rằng cả hai xâu đều giống nhau ngoại trừ một nhân vật - một 'x' thay của một 'b'.
Nó chỉ ra rằng đây không phải là trường hợp. Chuỗi đầu tiên được dịch thành:

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

và thứ hai là thực sự:

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

Họ thậm chí không cùng độ dài!
Có, 'b' được ăn bởi ký tự đại diện hex ('\xNNN').

Ít nhất, điều này có thể gây nhầm lẫn và lỗi vi tế cho trong chuỗi viết tay (bạn có thể tranh luận rằng unicode chuỗi không thuộc trong cơ thể code)

Nhưng vấn đề nghiêm trọng hơn, và cái tôi đang đối mặt, là mã được tạo tự động. Có vẻ như không có cách nào để diễn đạt điều này: {'x', 'y', 0x588, 'b', 'l', 'a' } như một chuỗi chữ mà không cần phải viết toàn bộ chuỗi trong biểu diễn hex, đó là lãng phí và không đọc được.

Bất kỳ ý tưởng nào về cách này?
Ý nghĩa trong ngôn ngữ hoạt động như thế này là gì?

+0

Ouch, chỉ cần chạy vào này trong C. May mắn là trình biên dịch VS2013 cảnh báo tôi rằng giá trị vật hex của tôi là ngoài 'char' phạm vi. – Spike0xff

Trả lời

14

Một cách đơn giản là sử dụng thời gian biên dịch nối chuỗi theo nghĩa đen, như sau:

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