2011-06-21 44 views
26

Trong VC++ chúng ta có kiểu dữ liệu “BOOL”, có thể giả định giá trị TRUE hoặc FALSE và chúng ta có kiểu dữ liệu “bool”, có thể giả định giá trị true hoặc false.Sự khác biệt BOOL và bool?

Sự khác biệt giữa chúng là gì và khi nào thì mỗi loại dữ liệu sẽ được sử dụng?

Trả lời

30

bool là loại C++ được tích hợp trong khi BOOL là loại cụ thể của Microsoft được định nghĩa là int. Bạn có thể tìm thấy nó trong windef.h:

typedef int     BOOL; 

#ifndef FALSE 
#define FALSE    0 
#endif 

#ifndef TRUE 
#define TRUE    1 
#endif 

Các giá trị cho một booltruefalse, trong khi cho BOOL bạn có thể sử dụng giá trị bất kỳ int, mặc dù TRUEFALSE macro được định nghĩa trong windef.h tiêu đề.

Điều này có nghĩa là toán tử sizeof sẽ mang lại 1 cho bool (các trạng thái chuẩn, mặc dù kích thước của bool được thực hiện xác định) và 4 cho BOOL.

Nguồn: Codeguru article

+5

sizeof (BOOL) vẫn là 4 trên máy tính Windows 64 bit. Cô lập chính nó từ việc triển khai kiểu trình biên dịch là lý do các typedef này tồn tại. –

+0

@Hans Đã xóa tham chiếu 64 bit. – luvieere

+5

CẢNH BÁO: sizeof (bool) không được chỉ định trong microsoft C++ và thay đổi từ 4 byte thành 1 byte giữa C++ 4.2 và 5.0 (xem http://msdn.microsoft.com/en-US/en-use/library/tf4dy80a. aspx) – eFloh

7

Để thêm vào những gì luvieere đã nói, bạn có thể trở lại một cái gì đó khác hơn TRUE hoặc FALSE từ một hàm trả về một BOOL ví dụ:

BOOL myFunc(int a) 
{ 
    if (a < 3) return FALSE; 
    else if (a > 3) return TRUE; 
    else return 2; 
} 

Và điều này có thể vì một BOOL về cơ bản là int. Vui lòng lưu ý rằng điều này không được khuyến khích vì nó phá hủy hoàn toàn khả năng đọc mã nhưng nó là thứ bạn có thể gặp và bạn sẽ tự hỏi tại sao nó lại như vậy.

+6

+1 để chỉ ra rằng đây thực sự là một ý tưởng tồi. Toàn bộ lý do để sử dụng BOOL là hạn chế các giá trị thành TRUE/FALSE; nếu bạn muốn 'int' bạn nên sử dụng' int'. –

10

API Windows có loại này trước khi bool được đưa vào C++. Và đó là lý do tại sao nó vẫn thoát trong tất cả các chức năng của Windows có BOOL. C không hỗ trợ bool loại dữ liệu, do đó BOOL phải ở lại.

+2

Tiêu chuẩn C99 không bao gồm một loại bool, mặc dù nó chắc chắn đúng là hầu hết các trình biên dịch C không hỗ trợ bool cho đến tương đối gần đây. – PeterAllenWebb

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