2009-05-06 8 views
19

Kiedy należy używać BOOL i bool w C++ i dlaczego?Kiedy należy używać BOOL i bool w C++?

Myślę, że używanie Bool jest czystsze i bardziej przenośne, ponieważ jest wbudowany. Ale BOOL jest nieunikniony, kiedy jesteś interaktywny ze starszym kodem/C-Code, lub robisz inter-op z .NET z kodem C/Windows API.

Moja polityka: Użyj bool wewnątrz C++. Używaj BOOL, gdy rozmawiasz ze światem zewnętrznym, np. Funkcja eksportu w Windows DLL.

Czy istnieje ostateczne wytłumaczenie, kiedy należy korzystać z jednej na drugiej?

+2

Do downwiterów: dlaczego? Zostaw komentarz, jeśli zagłosujesz na pytanie: –

+0

@ James: Przypuszczalnie dlatego, że pytanie zostało skonstruowane tak, aby było subiektywne, i w sensie subiektywnym nie jest to bardzo dobre pytanie. Próbowałem ją przeformułować, aby mogła mieć trochę więcej wartości, ale wątpię w to. – Pesto

+1

dlaczego głosy na dół? Ten jest dobry. –

Odpowiedz

6

Matthew Wilson omawia BOOL, bool i podobna w punkcie 13.4.2 z Imperfect C++. Mieszanie dwóch może być problematyczne, ponieważ mają one zazwyczaj różne rozmiary (a więc wskaźniki i odniesienia nie są wymienne), a ponieważ bool nie ma żadnego konkretnego rozmiaru. Próbuje użyć typedefs lub compilating warunkową załagodzić różnice między BOOL i bool lub stara się umożliwić pojedynczym typu Boolean do pracy zarówno w C i C++ jest jeszcze gorzej:

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

Takie podejście oznacza, że ​​powrót funkcji za typ może się różnić w zależności od języka, który go wywołuje; Wilson wyjaśnia, że ​​widział więcej niż jeden błąd we własnym kodzie i innych, które wynikają z tego. Kończy:

Rozwiązaniem tej niedoskonałości jest, jak to często bywa, abstynencja. Nigdy nie używam bool dla wszystkiego, co może być dostępne w wielu jednostkach linków - bibliotekach dynamicznych/statycznych, dostarczonych plikach obiektów - co zasadniczo nie oznacza funkcji lub klas, które pojawiają się poza plikami nagłówkowymi. Praktyczną odpowiedzią, taką jaką jest, jest użycie typu pseudo-boolowskiego, który ma rozmiar int.

Krótko mówiąc, zgodziłby się z twoim podejściem.

+2

Całkowicie nie rozumiem, dlaczego 32-bitowa liczba całkowita miałaby problemy z konwersją na bool. Konwersja na wartość bool jest prosta: zero konwertuje na wartość false, wszystko inne przekształca się w wartość true. Jeśli Wilson odciął bajt 32-bitowej liczby całkowitej, co jest jedynym sposobem, w jaki widzę, że to może się zdarzyć, rozwiązaniem jest napisanie kodu bez głupich sztuczek i pozwolenie kompilatorowi na przetwarzanie konwersji. Podobnie, nie ma niebezpieczeństwa w konwersji z BOOL innej firmy na Bool C++, chyba że ktoś jest zdecydowany to spieprzyć. –

+0

Masz rację, nie podążyłem za jego przykładem wystarczająco dokładnie i dlatego pominąłem kilka ważnych informacji. (Wilson zgadza się, że to był głupi błąd, ale twierdzi, że kod powinien być tak samo idiotyczny jak to tylko możliwe.) Zaktualizowałem moje podsumowanie, aby lepiej wyjaśnić. –

4
+4

Oczywiście jest dobry powód. Drugi artykuł mówi, że Win32 używa BOOL, aby pozostać kompatybilnym z C. Będziesz musiał użyć BOOL, jeśli pracujesz ze starszym kodem. –

+0

Nie widzę powodu, dla którego musiałbym używać BOOL, ponieważ C99 obsługuje bool, a wszystkie kompilatory C89, których używałem, również go wspierają. Ponadto, pytanie jest oznaczane jako C++, a nie C. –

+2

Zawsze staram się nawiązać do starych linków New Thing ... soooo +1 – Aardvark

2

Inna sytuacja, w której należy użyć BOOL: podczas wykonywania funkcji zwrotnej, która pobiera lub zwraca BOOL.

Na przykład EnumWindows() przyjmuje wskaźnik do funkcji wywołania zwrotnego z następującym podpisem:

BOOL CALLBACK EnumWindowsProc(  
    HWND hwnd, 
    LPARAM lParam 
); 

Jeśli używasz bool do tego, trzeba będzie typecast wskaźnik funkcji.

9

Jeśli BOOL jest pewnym typem integralnym i zawsze jest, a BOOL jest zdefiniowany tak, aby działał poprawnie, standardowe konwersje automatycznie go poprawią. Nie możesz ich używać zamiennie, ale możesz się zbliżyć.

Użyj BOOL w interfejsie, gdzie musisz porozmawiać z Win32 API lub czymkolwiek. Użyj bool wszędzie indziej.

-2

Myślę, że "prawdziwy"/"PRAWDA" i "fałsz"/"FAŁSZ" jako cukier syntaktyczny, rozwiązanie problemu, który nigdy nie istniał.Zawsze uważałem, że łatwiej jest używać i czytać "1" i "0".

Kiedy myślisz o tym, że flagi w rejestrach są włączone lub wyłączone, czy myślisz, że w 1s i 0s, a tightes? Co się stanie, jeśli chcesz zapisać kilka flag w jednej zmiennej? 1s i 0 są uniwersalne.

Myślę, że słowo "fałsz" jest zbyt długie dla własnego dobra. Kiedy widzę "0", wyróżnia się w mojej głowie niczym czerwony znak stopu. Znaki stop są czerwone, ponieważ czerwień koloru przyciąga uwagę. Czytanie słowa "fałsz" jest jak zobaczenie zielonego znaku stopu.

Więc do diabła z boolem i BOOLem. Domyślam się int.

... ale, naprawdę, poprawne ustawienie flag logicznych jest najmniejszym zmartwieniem w języku z wieloma sposobami popełnienia błędu jako C++.

+2

To tak, jakby powiedzieć, że nóż bojowy jest niebezpieczny, ponieważ może wytrzeć oko. Synu, musisz trzymać nóż ostro i obchodzić się z nim z szacunkiem. Ponieważ, tak, to wyłapie twoje oko, jeśli go wymachujesz. – knight666

+6

Problem, który nigdy nie istniał? Naprawdę? Jeśli widzisz funkcję, która ma zwracany typ 'bool', oznacza to, że może zwrócić wartość true lub false. Jeśli widzisz taki, który ma typ "int", co ci to mówi? – jalf

+0

Myślę, że słowo "fałsz" jest zbyt długie dla własnego dobra. Pozwala na kompresję kodu i szyfrowanie ... Nazwy zmiennych są zbyt długie, użyjmy alfabetu;). – AlexTheo

1

Jeśli chcesz używać funkcji napisanej w C++ (na przykład osadzonej w bibliotece DLL) w zarządzanym programie (na przykład w C#), to masz , aby używać do korzystania z BOOL. Jeśli zwrócisz bool, wynik zawsze będzie prawdziwy - jest to znany błąd od dawna i najwyraźniej jeszcze nie rozwiązany (VS 2010, .NET Framework 4).

Pozdrawiamy - Spook.

+0

Pewnie! Wystąpiłam w tym błędzie i dużo czasu zajęło mi zrozumienie, że to błąd platformy .NET. Chociaż istnieje możliwość obejścia tego problemu (atrybut). – zhaorufei