2009-05-06 70 views
19

Khi nào BOOL và bool được sử dụng trong C++ và tại sao?Khi nào BOOL và bool được sử dụng trong C++?

Tôi nghĩ rằng việc sử dụng bool là sạch hơn và di động hơn vì đó là loại được tích hợp sẵn. Nhưng BOOL là không thể tránh khỏi khi bạn tương tác với mã di sản/mã C, hoặc thực hiện inter-op từ .NET với mã C/Windows API.

Vì vậy, chính sách của tôi là: Sử dụng bool bên trong C++. Sử dụng BOOL khi nói chuyện với thế giới bên ngoài, ví dụ: chức năng xuất trong cửa sổ DLL.

Có giải thích dứt khoát về thời điểm sử dụng cái này với cái kia không?

+2

Để downvoters: tại sao? Để lại một bình luận nếu bạn bỏ phiếu cho câu hỏi xuống –

+0

@James: Có lẽ vì câu hỏi được cấu trúc là chủ quan, và theo nghĩa chủ quan thì đây không phải là một câu hỏi hay. Tôi đã cố gắng nói lại nó để nó có thể có giá trị hơn một chút, nhưng tôi nghi ngờ nó. – Pesto

+1

lý do bỏ phiếu xuống? đây là một người tốt. –

Trả lời

6

Matthew Wilson thảo luận BOOL, bool, và tương tự như trong phần 13.4.2 của Imperfect C++. Trộn hai có thể có vấn đề, vì chúng thường có kích thước khác nhau (và do đó con trỏ và tài liệu tham khảo không thể hoán đổi cho nhau), và vì bool không được đảm bảo để có bất kỳ kích thước cụ thể nào. Cố gắng sử dụng typedefs hoặc compilating có điều kiện để mịn hơn sự khác nhau giữa BOOLbool hoặc cố gắng để cho phép một loại Boolean duy nhất để làm việc trong cả C và C++ thậm chí còn tồi tệ hơn:

#if defined(__cplusplus) || \ 
    defined(bool) /* for C compilation with C99 bool (macro) */ 
typedef bool bool_t; 
#else 
typedef BOOL bool_t; 
#endif /* __cplusplus */ 

Cách tiếp cận này có nghĩa là lợi nhuận của một chức năng loại có thể khác nhau tùy thuộc vào ngôn ngữ gọi nó; Wilson giải thích rằng anh ta đã thấy nhiều hơn một lỗi trong mã của chính anh ta và những người khác kết quả từ việc này. Ông kết luận:

Giải pháp cho sự không hoàn hảo này là, thường xuyên như vậy, là kiêng. Tôi không bao giờ sử dụng bool cho bất kỳ thứ gì có thể được truy cập qua nhiều đơn vị liên kết — thư viện động/tĩnh, tệp đối tượng được cung cấp — về cơ bản có nghĩa là không có trong các hàm hoặc lớp xuất hiện bên ngoài tệp tiêu đề. Câu trả lời thực tế, như nó là, là sử dụng một loại Boolean giả, đó là kích thước của int.

Tóm lại, anh ấy sẽ đồng ý với cách tiếp cận của bạn.

+2

Tôi hoàn toàn không hiểu lý do tại sao một số nguyên 32-bit sẽ có vấn đề với chuyển đổi sang bool. Chuyển đổi thành bool rất đơn giản: không chuyển thành false, bất kỳ thứ gì khác chuyển thành true. Nếu Wilson đã cắt bỏ một byte của một số nguyên 32 bit, đó là cách duy nhất tôi thấy điều này có thể xảy ra, thì giải pháp là viết mã mà không có thủ thuật ngu xuẩn, và để trình biên dịch xử lý các chuyển đổi. Tương tự như vậy, không có nguy hiểm khi chuyển đổi từ một BOOL của bên thứ ba sang một bool b ++, trừ khi một người được xác định là vít nó lên. –

+0

Bạn nói đúng, tôi đã không làm theo ví dụ của anh ta đủ chặt chẽ và vì thế đã bỏ qua một số thông tin quan trọng. (Wilson đồng ý rằng đó là một sai lầm ngu ngốc nhưng lập luận rằng mã nên được làm bằng chứng ngu ngốc nhất có thể.) Tôi cập nhật tóm tắt của mình để giải thích rõ hơn. –

4
+4

Tất nhiên có một lý do chính đáng. Bài báo thứ hai nói rằng Win32 sử dụng BOOL để duy trì C tương thích. Bạn sẽ cần sử dụng BOOL nếu bạn đang làm việc với mã cũ. –

+0

Tôi không thấy lý do tại sao tôi sẽ cần phải sử dụng BOOL, kể từ khi C99 hỗ trợ bool, và tất cả các trình biên dịch C89 tôi đã sử dụng hỗ trợ nó quá. Ngoài ra, câu hỏi được gắn thẻ là C++, không phải C. –

+2

Tôi luôn upvote The Old New Thing liên kết ... soooo +1 – Aardvark

2

Một tình huống khác mà bạn nên sử dụng BOOL: khi triển khai hàm gọi lại nhận hoặc trả về BOOL.

Ví dụ, EnumWindows() mất một con trỏ tới một hàm callback với chữ ký sau đây:

BOOL CALLBACK EnumWindowsProc(  
    HWND hwnd, 
    LPARAM lParam 
); 

Nếu bạn sử dụng bool cho điều này, bạn sẽ phải định kiểu con trỏ hàm của bạn.

9

Nếu BOOL là một loại loại tích phân nào đó và luôn là BOOL được xác định để nó hoạt động đúng, chuyển đổi chuẩn sẽ tự động làm đúng. Bạn không thể sử dụng chúng thay thế cho nhau, nhưng bạn có thể đến gần.

Sử dụng BOOL tại giao diện, nơi bạn phải nói chuyện với API Win32 hoặc bất kỳ thứ gì. Sử dụng bool ở mọi nơi khác.

-2

Tôi nghĩ về "true"/"TRUE" và "false"/"FALSE" làm đường cú pháp, giải pháp cho vấn đề chưa từng tồn tại.Tôi đã luôn luôn nghĩ rằng nó dễ dàng hơn để sử dụng cả hai và đọc "1" và "0".

Khi bạn nghĩ về cờ trong sổ đăng ký đang bật hoặc tắt, bạn có nghĩ rằng trong 1s và 0s hoặc trues và falses không? Điều gì xảy ra nếu bạn muốn lưu trữ nhiều cờ trong một biến duy nhất? 1 và 0 là phổ biến.

Tôi nghĩ từ "sai" quá dài vì lợi ích của chính nó. Khi tôi nhìn thấy chữ "0", nó nổi bật trong đầu tôi như một dấu hiệu dừng màu đỏ. Các dấu hiệu dừng lại có màu đỏ vì màu đỏ sẽ thu hút sự chú ý của mọi người. Đọc từ "sai" giống như nhìn thấy một dấu hiệu dừng màu xanh lá cây.

Vì vậy, đến địa ngục với bool và BOOL. Tôi mặc định int.

... nhưng, thực sự, nhận được cờ boolean đúng là ít lo lắng nhất trong một ngôn ngữ với nhiều cách để phạm sai lầm như C++.

+2

Điều đó giống như nói rằng một con dao chiến đấu là nguy hiểm vì nó có thể chọc ra mắt của bạn. Con trai, bạn cần phải giữ cho con dao của bạn sắc nét và xử lý nó một cách tôn trọng. Bởi vì, có, nó sẽ đưa ra mắt của bạn nếu bạn đang flailing nó về. – knight666

+6

Một vấn đề chưa từng tồn tại? Có thật không? Nếu bạn thấy một hàm có kiểu trả về 'bool', nó sẽ cho bạn biết rằng nó có thể trả về true hoặc false. Nếu bạn thấy một cái có kiểu trả về 'int' thì cái đó cho bạn biết cái gì? – jalf

+0

Tôi nghĩ từ "sai" quá dài vì lợi ích của chính nó. Cho phép thực hiện việc nén mã và mã hóa ... Các tên biến quá dài, hãy sử dụng bảng chữ cái;). – AlexTheo

1

Nếu bạn muốn sử dụng hàm được viết bằng C++ (ví dụ nhúng trong thư viện DLL) trong chương trình được quản lý (ví dụ trong C#), bạn để sử dụng BOOL. Nếu bạn trả về bool, kết quả sẽ luôn đúng - đây là lỗi đã biết trong một thời gian dài và dường như chưa được giải quyết (VS 2010, .NET Framework 4).

Trân trọng - Spook.

+0

Chắc chắn! Tôi đã bị lỗi này và tôi mất nhiều thời gian để nhận ra rằng đó là một lỗi của .NET. Mặc dù có cách giải quyết (thuộc tính) cho nó. – zhaorufei

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