Rzuciłem okiem na kod C ++ open source i zauważyłem wiele podwójnych punktów pod punktami, które są używane w kodzie, głównie na początku nazw zmiennych.
return __CYGWIN__;
Zastanawiam się tylko, czy jest tego powód, czy tylko niektórzy ludzie kodują style? Myślę, że utrudniam czytanie.
c++
double-underscore
Nathan W.
źródło
źródło
#define FOO 1
ale nie mogą,#define __FOO__ 1
dlatego implementacja może swobodnie używać nazwy__FOO__
dla własnych makr, zmiennych, funkcji itp.Odpowiedzi:
Od programowania w C ++, reguł i zaleceń :
źródło
namespace
wprowadzeniem._main
.O ile nie czują, że są „częścią implementacji”, czyli standardowymi bibliotekami, to nie powinni.
Zasady są dość szczegółowe i nieco bardziej szczegółowe niż sugerowały to niektóre inne.
Wszystkie identyfikatory, które zawierają podwójne podkreślenie lub rozpoczynają się od podkreślenia, po którym następuje duża litera, są zarezerwowane do użytku implementacji we wszystkich zakresach, tj. Mogą być używane dla makr.
Ponadto wszystkie inne identyfikatory zaczynające się od podkreślenia (tj. Po którym nie następuje inny podkreślenie ani duża litera) są zarezerwowane do implementacji w zakresie globalnym. Oznacza to, że możesz używać tych identyfikatorów we własnych przestrzeniach nazw lub w definicjach klas.
Dlatego firma Microsoft używa nazw funkcji z początkowym podkreśleniem i małymi literami w wielu podstawowych funkcjach biblioteki wykonawczej, które nie są częścią standardu C ++. Te nazwy funkcji na pewno nie kolidują ze standardowymi funkcjami C ++ ani funkcjami kodu użytkownika.
źródło
Zgodnie ze standardem C ++ identyfikatory zaczynające się od jednego podkreślenia są zarezerwowane dla bibliotek. Identyfikatory zaczynające się od dwóch podkreśleń są zarezerwowane dla dostawców kompilatorów.
źródło
Powyższe uwagi są prawidłowe.
__Symbol__
jest generalnie magicznym tokenem dostarczanym przez dostawcę pomocnego kompilatora (lub preprocesora). Prawdopodobnie najczęściej używanymi z nich są__FILE__
i__LINE__
, które są rozszerzane przez preprocesor C w celu wskazania bieżącej nazwy pliku i numeru wiersza. Jest to przydatne, gdy chcesz zarejestrować jakiś rodzaj błędu potwierdzenia programu, w tym tekstową lokalizację błędu.źródło
To coś, czego nie powinieneś robić w „normalnym” kodzie. Gwarantuje to, że kompilatory i biblioteki systemowe mogą definiować symbole, które nie będą kolidować z Twoimi.
źródło
Podwójne podkreślenia są zastrzeżone dla implementacji
Najczęściej głosowana odpowiedź cytuje Programowanie w C ++: Zasady i zalecenia :
Jednak po przeczytaniu kilku standardów C ++ i C nie mogłem znaleźć żadnej wzmianki o podkreśleniach ograniczonych tylko do wewnętrznego użytku kompilatora. Standardy są bardziej ogólne i zastrzegają podwójne podkreślenia do wdrożenia .
C ++
C ++ (bieżąca wersja robocza, dostęp 2019-5-26) stwierdza w
lex.name
:do
Chociaż to pytanie jest specyficzne dla C ++, zacytowałem odpowiednie sekcje ze standardów C 99 i 17:
C99 sekcja 7.1.3
C17 mówi to samo co C99.
Jaka jest implementacja ?
W przypadku C / C ++ implementacja luźno odnosi się do zestawu zasobów niezbędnych do utworzenia pliku wykonywalnego z plików źródłowych użytkownika. To zawiera:
Przykładowe realizacje
Istnieje wiele różnych implementacji C ++ wymienionych w Wikipedii . (bez linku do kotwicy, ctrl + f "implementacja")
Oto przykład implementacji C / C ++ firmy Digital Mars, która rezerwuje pewne słowa kluczowe dla ich funkcji.
źródło
Oprócz bibliotek, na które odpowiadało wiele innych osób, niektórzy ludzie nazywają również makra lub #define wartości do użycia z preprocesorem. Ułatwiłoby to pracę i mogłoby umożliwić obejście błędów w starszych kompilatorach.
Podobnie jak inni wspomnieli, pomaga zapobiegać kolizji nazw i pomaga odróżnić zmienne biblioteczne od własnych.
źródło