2010-08-14 46 views
5

Gần đây tôi đã đến khi cần có các xác nhận biên dịch trong C++ để kiểm tra xem các kích thước của hai loại có bằng nhau hay không.Xác nhận thời gian biên dịch trong C++?

tôi thấy macro sau trên web (tuyên bố có nguồn gốc từ hạt nhân Linux):

#define X_ASSERT(condition) ((void)sizeof(char[1 - 2*!!(condition)])) 

mà tôi sử dụng như vậy:

X_ASSERT(sizeof(Botan::byte) != sizeof(char)); 

này được tôi tò mò - mặc dù điều này hoạt động, có cách nào hiệu quả hơn không? (rõ ràng là có nhiều hơn một cách, vì nó là) Có lợi thế hay bất lợi cho các phương pháp nhất định?

+0

Cảm ơn tất cả các câu trả lời tất cả mọi người, rất thú vị. Tôi rất vui khi thấy C++ 0x đang nhận 'static_assert', tôi không nhớ đã đọc về điều đó trước đây. ;) –

Trả lời

6

Bạn có thể muốn xem Boost StaticAssert. Các internals không chính xác sạch (hoặc không phải là lần cuối cùng tôi nhìn) nhưng ít nhất nó dễ nhận biết hơn, vì vậy hầu hết mọi người biết những gì nó có nghĩa là. Nó cũng đi đến một số cơn đau để sản xuất các thông báo lỗi có ý nghĩa hơn nếu bộ nhớ phục vụ.

+3

Tôi thực sự thích ['BOOST_MPL_ASSERT_MSG'] (http://www.boost.org/doc/libs/1_43_0/libs/mpl/doc/refmanual/assert-msg.html). – GManNickG

10

Trong C++ 0x, có một tính năng ngôn ngữ mới, static_assert, cung cấp cách thức tiêu chuẩn để tạo xác nhận biên dịch. Ví dụ:

static_assert(sizeof(Botan::byte) != 1, "byte type has wrong size"); 

Visual C++ 2010 hỗ trợ static_assert, như g ++ 4.3 (và lớn hơn) và Intel C++ 11.0.

0

Có một chỉ thị tiền xử lý xuất sắc #error (xem here để có một bài viết tốt về nó), nhưng tôi tin rằng nó cần phải nằm trong một số #if trái ngược với việc sử dụng trong "tự do" như trong ví dụ của bạn.

+3

'# error' có bất lợi là nó là một chỉ thị tiền xử lý và được đánh giá trước khi nguồn được phân tích cú pháp, và bạn không thể sử dụng các thứ như' sizeof' hoặc không macro trong chỉ thị '# if' điều khiển. –

1

Một số tùy chọn thú vị khác đang ở đây: http://www.jaggersoft.com/pubs/CVu11_3.html

đọc Neat là tác giả đi C (không phải C++) spec tìm kiếm cú pháp có thể được thừa hưởng như khẳng định thời gian biên dịch.

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