2011-08-11 44 views
5

Tôi đã đọc về cách tạo mã dễ dàng hơn bằng cách sử dụng số nguyên chiều rộng cố định. Tôi thấy this Điều đó đã giúp giải thích điều gì đó, và cuối cùng nó cho thấy sử dụng công đoàn vô danh này để phát hiện và báo cáo typedef lỗi:Phát hiện và báo cáo lỗi typedef ... Đây là gì?

static union 
{ 
    char int8_t_incorrect[sizeof( int8_t) == 1]; 
    char uint8_t_incorrect[sizeof(uint8_t) == 1]; 
    char int16_t_incorrect[sizeof(int16_t) == 2]; 
    char uint16_t_incorrect[sizeof(uint16_t) == 2]; 
    char int32_t_incorrect[sizeof(int32_t) == 4]; 
    char uint32_t_incorrect[sizeof(uint32_t) == 4]; 
}; 

tôi là một chút mất và tôi đã hy vọng ai đó có thể giải thích điều này đang làm ?

Trả lời

4

Nó lạm dụng trình biên dịch, đó là những gì nó đang làm.

Về cơ bản, sizeof(type) == num đang được đánh giá vào thời gian biên dịch và sẽ tạo ra 0 hoặc 1 (sai hoặc đúng). Nếu nó là 0 (không có gì trong số đó), nó sẽ tạo ra một lỗi trình biên dịch, vì bạn không thể khai báo một mảng có kích thước bằng không. Tuy nhiên, như đã đề cập, điều này là khá lạm dụng của trình biên dịch, và hầu hết các môi trường xây dựng sane sẽ đảm bảo typedefs là chính xác cho bạn (ví dụ autoconf có sẵn các macro cho loại công cụ này).

+0

Thậm chí các trình biên dịch nhúng cũng thông minh hơn một chút so với khi bài viết được viết, năm 2004. –

+0

Ồ tôi hiểu, cảm ơn rất nhiều vì đã giải thích ... có vẻ như đơn giản bây giờ là – Morgan

+1

Tôi không thấy đây là "lạm dụng" . Vô nghĩa, có lẽ. –

4

Nếu bất kỳ kiểm tra bình đẳng nào dẫn đến sai, công đoàn sẽ có trường có kích thước mảng là 0, không được phép và sẽ dẫn đến lỗi trình biên dịch.

+0

Cảm ơn, phản hồi của bạn và câu trả lời thứ hai đã giúp tôi giải quyết vấn đề này. – Morgan

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