Không cần cho bất kỳ chuyển đổi rõ ràng:
BOOL x = some_value;
bool b = x;
Việc chuyển đổi tiềm ẩn của một số loại để bool
mang false
ứng với giá trị 0
, và true
cho bất kỳ giá trị khác không.
Ngẫu nhiên, bạn đã cho chúng tôi biết cách <windows.h>
xác định FALSE
và TRUE
. Làm thế nào để nó xác định BOOL
? (Từ nhận xét của bạn, đó là typedef int BOOL;
)
Nhưng một số trình biên dịch có thể cảnh báo về chuyển đổi tiềm ẩn này, mặc dù đó là mã hoàn toàn hợp lệ. Trình biên dịch được tự do cảnh báo về bất cứ điều gì họ thích, bao gồm cả phông chữ xấu xí mà bạn đã sử dụng để viết mã của mình. g ++, ví dụ, không phàn nàn về việc chuyển đổi, ngay cả với:
g++ -std=c++11 -pedantic -Wall -Wextra ...
Nhưng theo this online Visual C++ compiler, VC++ không tạo ra một cảnh báo:
warning C4800: 'BOOL' : forcing value to bool 'true' or 'false' (performance warning)
Ngay cả với một static_cast
, nó vẫn tạo ra cảnh báo.
Bạn có thể tránh cảnh báo bằng cách sử dụng !!x
hoặc x ? true : false
. Nhưng tôi không chắc liệu cách chữa trị có tốt hơn bệnh hay không.
Cách đơn giản và chính xác để thực hiện việc này đơn giản là chỉ định giá trị và dựa vào chuyển đổi tiềm ẩn để làm điều đúng (nó sẽ).
Nếu bạn có yêu cầu bổ sung để tránh cảnh báo trình biên dịch, thì điều này sẽ trở thành một câu hỏi về Visual C++ chứ không phải ngôn ngữ C++. Cũng có thể có một số cách để ngăn chặn các cảnh báo nhất định mà không thay đổi nguồn - mặc dù rủi ro mất đi những cảnh báo tương tự khi chúng thực sự có ý nghĩa. Trong một bình luận, Dieter Lücking đề xuất:
#pragma warning(disable: 4800) // forcing value to bool 'true' or 'false' (performance warning)
nhưng có vẻ như nó vẫn yêu cầu sửa đổi nguồn. Có lẽ có cái gì đó tương đương mà không.
Một điều nữa: kể từ BOOL
thực sự gõ int
, giải pháp đề xuất này:
bool c = (x == TRUE);
không tương đương với những người khác. Bất kỳ số không khác int
được coi là đúng, nhưng chỉ có giá trị 1
là bằng đến TRUE
.Ví dụ trên sẽ đặt c
thành false
nếu x == 2
- trong khi if (x)
vẫn coi đó là điều kiện thực. Không bao giờ so sánh các giá trị boolean cho sự bình đẳng với true
hoặc TRUE
. (So sánh chúng với false
hoặc FALSE
là an toàn hơn, nhưng vẫn không cần thiết;. Đó là những gì các nhà điều hành !
là cho)
này tất cả các giả định rằng nếu bạn có một giá trị kiểu BOOL
, bạn chỉ quan tâm cho dù đó là falsish hoặc truthy (zero hoặc khác không). Thật không may, điều này có thể không phải lúc nào cũng đúng. Khi Ben Voight's answer chỉ ra, API của Microsoft có ít nhất một hàm, GetMessage, trả về kết quả là BOOL
là không phải là giá trị Boolean đơn giản. Trong trường hợp khủng khiếp như vậy, việc chuyển đổi từ BOOL
sang bool
không thích hợp nếu bạn cần phân biệt giữa nhiều giá trị khác 0.
Cuối cùng, tôi đổ lỗi cho Microsoft để xác định loại
BOOL
cho một ngôn ngữ đã có loại được xây dựng hoàn toàn tốt trong loại
bool
.
Thực ra điều đó không công bằng lắm; nó được sử dụng trong các API cần phải truy cập được từ cả C và C++. Định nghĩa của Microsoft về BOOL
có thể quay lại triển khai C của họ, nơi nó có ý nghĩa - ít nhất là trước C99, mà Microsoft vẫn không hỗ trợ. (Tôi không biết liệu của Microsoft trình biên dịch C hỗ trợ _Bool
Thậm chí nếu có, _Bool
có một số khác biệt về ngữ nghĩa từ int
, và thay đổi định nghĩa của BOOL
có thể phá vỡ một số mã -.. Đặc biệt là mã có sử dụng GetMessage
)
ý bạn là gì bởi "thành ngữ"? –
'bool c = (x == FALSE)'? :) – Inspired
Điều này có lẽ không phù hợp cho SO bởi vì nó sôi xuống sở thích cá nhân, tôi tin. – lpapp