Dlaczego brzydkie słowa kluczowe w C11?


15

Obecnie czytam projekt specyfikacji C11. Nowe wprowadzone słowa kluczowe: _Bool, _Alignof, _Atomicwszystkie 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_tpełzaniem w standardzie!

Czy zgodność wsteczna niestandardowego kodu jest jedyną przyczyną nowego stylu słów kluczowych?


2
Nie, nie martwiłbym się tak długimi typami. Liczba kombinacji liter i cyfr _, az, AZ i 0-9 oznacza, że ​​prawdopodobnie byłyby po prostu krótkie i trudne do zapamiętania.
Neil

2
Ładniej wyglądający synonim każdego słowa kluczowego jest często definiowany w odpowiednim standardowym pliku nagłówkowym biblioteki. Na przykład <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.
andrew.punnett

Odpowiedzi:


20

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.


Należy zauważyć, że pytanie dotyczyło C, a nie C ++, nie ma znaczenia. Twoja odpowiedź obejmuje powód, dla którego nowy suproprted typ zostałby nazwany czymś, co pozwoli uniknąć konfliktu z niestandardowym typem Boolw 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ć.
Ramhound

1
@Ramhound, IMHO boolbył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.
Vorac,

6
@Vorac: Problem polega na tym, że jeśli boolzostanie 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 na boolsiebie, zostało to dodane typedef _Bool boolw wersji <stdbool.h>.
Bart van Ingen Schenau,

1
@BartvanIngenSchenau - który pozwala ludziom zastąpić własny typedef wartości boolowskiej wartością zawartą w nim stdbool.hlub zaktualizować własny typedef do nowego typu w celu obsługi jego starszego kodu.
Ramhound

1
@Ramhound - osoby ze zmiennymi, które były sprzeczne z nowymi słowami kluczowymi C11, mogą również „Więc nie używać?”. Istnieje flaga kompilacji std = xxx, aby zapobiec konfliktom z nowymi standardami językowymi.
Skuter

8

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:

Dla implementatora są również zarezerwowane wszystkie zewnętrzne identyfikatory rozpoczynające się znakiem podkreślenia i wszystkie inne identyfikatory rozpoczynające się znakiem podkreślenia, po którym następuje duża litera lub znak podkreślenia.

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.


4
Powinieneś zacytować i ewentualnie podać link lub nazwać odpowiednią sekcję standardów, aby inni mogli szybko zweryfikować twoje oświadczenie. Poprawi to twoją odpowiedź.
SpaceTrucker
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.