Can bool DataType będzie używany w C ++ i może być zapewniona przenośność?

Istnieją dyskusje na ten temat częściowo w innych stanowiskach, ale nie omawia specjalnie przenośności.

Chciałbym wiedzieć, czy mogę użyć bool i upewnij się, że sporządza w większości systemów (powiedzmy 99%), jeśli nie wszystkie systemy.

c++
0
arun 5 czerwiec 2018, 08:20

4 odpowiedzi

Najlepsza odpowiedź

{{X0}. lat) należy ustawić.

Jeśli chodzi o wstępnie standardowy C ++, rozglądając się, wydaje się, że na kompilatorach PC miała swój wygląd około 1996-1997 (Visual C ++ 5, Borland C ++ 5); Rzeczywiście, GOTW # 26 wspomina, że bool jest "jedynym wbudowanym typem danych Aby dodać do C ++, ponieważ [Strougroup] Adnotowano podręcznik odniesienia C ++ "(1990), więc jest uzasadnione, aby wywnioskować, że urodził się gdzieś między 1990 a 1996 r. Czytanie wokół Web 1993 jest rzucane przez całą" data urodzenia "dla {data urodzenia" {X1}} w C ++, ale nie mogłem znaleźć dla niego pojedynczego niezawodnego odniesienia.

Chociaż nadal możesz znaleźć przestarzałe strony (głównie z kursów uniwersyteckich), które wyjaśniają, jak obejść nieobecność {X0}} w starych kompilatorach, obecnie nie ma problemów z kompatybilnością, chyba że jesteś zmuszony do używania naprawdę starożytnych narzędzi (I Patrząc na Ciebie, kursy uniwersyteckie, które polecają Turbo C ++ w 2018 r.).

Może zostałeś zdezorientowany z C, gdzie pojawił się bool tylko w C99?


Był bool dostępny w pre-Standard C ++ (jak Cfront)?

Patrząc na Źródła Cfront 3.0.3 (1994, chociaż Oryginalny 3.0 został zwolniony w 1991 r.), bool jest rzucony dookoła całkiem nieco, zwłaszcza w standardowych nagłówkach, takich jak basic_string.h.

Jeśli chodzi o jego definicję, istnieje szalona mieszanka {X0}} (ale wewnątrz #ifdef CFRONT_COMPATIBLE_LUCENT, więc może to tylko definicja zgodności? i WTF, data praw autorskich wynosi 1996?), {{x3 }}, a także {X4}} w obiecującym neader std_bool.h (który ma jednak również prawo autorskie 1996!).

Patrząc na Lexer i Parsera Nie mogłem znaleźć wymienia się bool, chociaż The Demangler cytuje go jako podstawowy typ, więc istnieje jakieś dowody, że ktoś pomyślał, że to (lub, będzie) wbudowany.

Wciąż, podczas gdy jego precyzyjna definicja jest trochę rozmycia, jak powiedziała powyżej coś o nazwie bool z true i false wartości był > Rzeczywiście dostępny i używany w bibliotece standardowej, więc jeśli planujesz skompilować kod za pomocą Cfront 3.0, {X3}} prawdopodobnie będzie prawdopodobnie najmniej obaw. :-)

Nawiasem mówiąc, ta podróż w dół Starożytna C ++ przynosi również trochę smutku: Cfront 3.0 Dostarczany za pomocą biblioteki Regex C ++, coś, co musieliśmy czekać na C ++ 11, aby wrócić ponownie (i który pozostał na poziomie Segfault" złamane dla całkiem niektórych Więcej lat w Libstdc ++).

5
Matteo Italia 19 czerwiec 2018, 06:14

bool jest typem wbudowanym, dzięki czemu jest jako przenośny jak sam język C ++

8
YePhIcK 5 czerwiec 2018, 05:22

Należy pamiętać, że jeśli martwisz się o przenośność pamięci masowej (serializację), bool nie jest szczególnie przenośnym typem, rozmiar nie jest związany (rzeczywiście nie jest to tak samo rozmiar jak "char ').

To pomimo faktu, że Bool był w C ++ tak długo, jak język został znormalizowany.

1
SoronelHaetir 5 czerwiec 2018, 06:45

C ++ nie znaczy wiele (to więcej Rodzina powiązanych języków, niż jedna). Musisz skierować standard specyficzny standard C ++. Rozważ przynajmniej C ++ 11 (ale nie przejmuj się starszymi standardami, co prawdopodobnie wspomniano bool również), a jeśli to możliwe, C ++ 14.

Następnie bool jest częścią C ++ 11 (a także późniejszych standardów, takich jak C ++ 14 lub C ++ 17). Sprawdź, czytając N3337. Był również częścią C ++ 98, ale nie powinieneś obchodzić.

(Zwróć uwagę, że C ++ zmienił się dużo od C ++ 11 włączony, dlatego nie polecam stosowania starszych standardów, takich jak C ++ 98; i sprawy przenośności tylko w odniesieniu do określonego standardu; zwykle nie ma sensu Napisz kod przenośny do wszystkich C ++ 98, C ++ 11, C ++ 17, C ++ 20)

Jeśli chcesz kodować przestarzały standard, taki jak C ++ 98, co może skompilować później standardowy kompilator zgodny (np. Niektóre C ++ 17 kompatybilny) powinieneś zadać inne pytanie. bool nie jest wtedy problem, ale masz wiele innych (ważniejszych).

Pytanie tego, co jest standardem C ++ wspierany na większości platform jest bardzo różny. Jeśli możesz sobie pozwolić na wykorzystanie kompilatorów (np. Jeśli możesz zainstalować najnowsze wersje GCC lub Clang) Założyłbym się na C ++ 11.

Z pewnością będziesz mógł znaleźć, być może w niektórych muzeum, przestarzały komputer, który ma kompilator C ++ 98, ale nie C ++ 11 jeden. Możesz nawet znaleźć komputery bez kompilatorów C ++ (lub nawet bez żadnych kompilatorów).

Z pewnością stare Sun3 / 60 od 1987 r. W muzeum akceptuje dialekt C ++ (być może niektóre Cfront ) bardzo różny z kilku Dialekty C ++ zaakceptowane przez GCC 8 na moim pulpicie Linuksa.

Co chcesz kodułować, jest standardem (taki jak C ++ 11, który, jak C ++ 98, C ++ 14, C ++ 17 również wspomina bool). Zapewnia to przenośność innych implementacji tak samo . Oczywiście C ++ 98, C ++ 11, C ++ 14, C ++ 17 Wszystkie wspomnienia bool; Ale jeśli chcesz kodyfikować z kilka standardów C ++ (i może to być trudne), potrzebujesz wiele ostrożności (prawdopodobnie korzystać z niektórych warunków preprocesora, aby zapewnić różne normy C ++, gdy jest to potrzebne).

-4
Basile Starynkevitch 5 czerwiec 2018, 05:57