Obecnie czytam projekt specyfikacji C11. Nowe wprowadzone słowa kluczowe: _Bool, _Alignof, _Atomic
wszystkie wyglądają jak niestandardowe rozszerzenia, a nie standardowe zastrzeżone słowa kluczowe, takie jak struct, union, int
.
Zdaję sobie sprawę, że standard zasadniczo składa się ze znormalizowanych rozszerzeń ... ale nadal jest to okropne! Może wkrótce skończymy z __Long_Long_Reallylong_Integer_MSVC_2020_t
pełzaniem w standardzie!
Czy zgodność wsteczna niestandardowego kodu jest jedyną przyczyną nowego stylu słów kluczowych?
<stdbool.h>
plik nagłówka dowolnej implementacji C11 musi zawierać makro preprocesora, takie jak#define bool _Bool
. To fajne rozwiązanie, ponieważ zachowuje kompatybilność wsteczną, ale pozwala nowemu kodowi, w tym nowemu plikowi nagłówkowemu, na stosowanie bardziej atrakcyjnej składni.Odpowiedzi:
Wyobrażam sobie, że ważniejsza jest kompatybilność wsteczna z doskonale standardowym kodem.
Jeśli dodasz słowo kluczowe, które mogło być użyte jako prawidłowy identyfikator w poprzednim kodzie, wywołujesz mnóstwo bólu, możliwych subtelnych błędów, szczególnie w C, języku z jakoś skomplikowanymi regułami analizy.
Jeśli te identyfikatory były gdzieś używane jako interfejs publiczny, przysparzasz bólu wszystkim użytkownikom takich niefortunnych bibliotek, którzy mogą w ogóle nie używać C, ale wywołać bibliotekę z Ruby lub Pythona itp.
Właśnie dlatego nowe słowa kluczowe będą mniej przypominać miłe słowa, a bardziej przypominać hakowanie, które ludzie mają mniejsze szanse na wykorzystanie w innym celu.
źródło
Bool
w starszym kodzie, który został powszechnie zaakceptowany jako logiczny, ale nigdy tak naprawdę nie jest częścią standardu C, więc założenie nie jest bezpieczne robić.bool
byłby bardziej w duchu C. Ponadto nie jestem do końca przekonany tą odpowiedzią, ponieważ brzydkie słowa mogły być również użyte w niestandardowym kodzie. A zmiana stylu słów sprawia, że standardowe słowa są trudniejsze do rozpoznania na pierwszy rzut oka.bool
zostanie dodany bezwarunkowo do języka, wówczas wszystkie projekty, które mają swoją (całkowicie uzasadnioną) wersjębool
, przestaną się kompilować. Poważnie zaszkodziłoby to akceptacji zmiany języka. To jest powód, dla którego wszystkie nowe identyfikatory są pobierane z zestawu zastrzeżonego (a więc zaczynają się od_[capital]
). Ponieważ istnieje również duże zapotrzebowanie nabool
siebie, zostało to dodanetypedef _Bool bool
w wersji<stdbool.h>
.stdbool.h
lub zaktualizować własny typedef do nowego typu w celu obsługi jego starszego kodu.Nazwy zaczynające się od znaku podkreślenia i dużej litery (i wszystko z podwójnym znakiem podkreślenia) były zarezerwowane dla implementacji kompilatora / biblioteki standardowej w poprzednich standardach.
Z zastrzeżonych identyfikatorów C89 i C99:
Teoretycznie te nowe słowa kluczowe nie powinny być używane w żadnym wcześniej napisanym kodzie, co prowadzi do lepszej kompatybilności wstecznej niż jakakolwiek prosta nazwa, co jest prawdopodobnie jedynym powodem.
źródło