2011-10-13 38 views
24

Tại sao đây lại là cảnh báo? Tôi nghĩ có nhiều trường hợp khi sử dụng hằng số int nhiều char thay vì "không có nghĩa" hoặc thay vì xác định các biến const có cùng giá trị. Khi phân tích cú pháp wave/tiff/các loại tệp khác rõ ràng hơn để so sánh giá trị đọc với một số 'EVAW', 'dữ liệu', v.v ... thay vì giá trị tương ứng của chúng.Cảnh báo liên tục nhiều ký tự

Mẫu mã:

int waveHeader = 'EVAW'; 

Tại sao điều này đưa ra một cảnh báo?

+0

Tôi đang gặp sự cố khi cố gắng hiểu câu hỏi của bạn. Bạn có thể làm cho nó rõ ràng hơn? –

+0

@ 0A0D Tôi sẽ thử :) Xin lỗi – Felics

+0

Related: http: // stackoverflow.com/questions/7497192/enum-hằng số-câu hỏi –

Trả lời

28

According to the standard (§6.4.4.4/10)

Giá trị của một hằng số nhân vật số nguyên chứa nhiều hơn một ký tự (ví dụ: 'ab'), [...] là thực hiện xác định.

long x = '\xde\xad\xbe\xef'; // yes, single quotes 

Đây là ISO hợp lệ 9899: 2011 C. Nó biên dịch mà không cần cảnh báo dưới gcc với -Wall, và một “đa nhân vật nhân vật liên tục” cảnh báo với -pedantic.

Từ Wikipedia:

hằng Multi-ký tự (ví dụ như 'xy') là hợp lệ, mặc dù hiếm khi hữu ích - họ để cho một cửa hàng một vài nhân vật trong một số nguyên (ví dụ 4 ký tự ASCII có thể phù hợp trong một Số nguyên 32 bit, 8 trong số 64 bit). Vì thứ tự các ký tự được đóng gói thành một int không phải là được chỉ định, việc sử dụng di động các hằng số nhiều ký tự là khó khăn.

Vì lợi ích về tính di động, không sử dụng hằng số nhiều ký tự với các loại tích phân.

+3

Tôi không chắc cụm từ cuối cùng có ý nghĩa gì; hằng số nhiều ký tự luôn có các kiểu tích phân (và các hằng số như vậy không có tiền tố luôn có kiểu 'int'). –

12

Cảnh báo này hữu ích cho các lập trình viên có thể viết nhầm 'test' nơi họ cần viết "test".

Điều này xảy ra thường xuyên hơn nhiều so với các lập trình viên thực sự muốn các hằng số int nhiều char.

+2

Đây là một ví dụ tốt, nhưng điều gì xảy ra khi tôi thực sự muốn viết 'test' và tôi có một cảnh báo. Tôi không để bất kỳ cảnh báo trong mã của tôi ... – Felics

+0

Bạn phải đối phó với cảnh báo, hoặc tìm tùy chọn trình biên dịch của bạn để vô hiệu hóa cảnh báo cụ thể này (có thể làm tổn thương bạn ở một số nơi khác trong mã của bạn ;-)). –

+1

Một lỗi lập trình ngẫu nhiên khác là xác định sai cú pháp để thoát hex và viết '\ 0x61' khi có nghĩa là '\ x61'. – tml

11

Nếu bạn hài lòng bạn biết những gì bạn đang làm và có thể chấp nhận những vấn đề tính di động, trên GCC ví dụ bạn có thể vô hiệu hóa các cảnh báo trên dòng lệnh:

-Wno-multichar 

tôi sử dụng này cho riêng tôi ứng dụng hoạt động với tiêu đề tệp AVI và MP4 vì những lý do tương tự đối với bạn.

3

Ngay cả khi bạn sẵn sàng tra cứu hành vi của mình, xác định triển khai của bạn, hằng số nhiều ký tự sẽ vẫn là thay đổi theo độ dài.

Tốt hơn để sử dụng cấu trúc (POD) {char [4]}; ... và sau đó sử dụng UDL như "WAVE" _4cc để dễ dàng tạo các trường hợp của lớp đó

Các vấn đề liên quan