Czy zmienne / elementy początkowe z podkreśleniem mogą rozwiązać zagadkę kompilatora?

12

Od liceum nauczono mnie, że definiowanie zmiennych takich jak to:

int _a;

lub

int __a;

należy uznać za złą praktykę, ponieważ w końcu łamigłówki kompilatory wykorzystujące zmienne zaczynające się od znaku podkreślenia do nazwania zmiennych tymczasowych.

O ile wiem, jest to powód, dla którego niektórzy lubią przenosić podkreślenie na końcu nazwy, na przykład:

int a_;

Widzę jednak dużo kodu, który wykorzystuje zmienne początkowe podkreślenia. Ten kod buduje się całkiem dobrze zarówno w Visual Studio 2010, jak i g ++ 4.x.

Zastanawiam się: czy obecnie nie jest to problem? Czy nowoczesne kompilatory są mądrzejsze od konwencji nazewnictwa?

Emiliano
źródło
Nie jest to prawdziwa odpowiedź, ale prawdopodobne jest, że kompilatory C ++ firmy Microsoft są bardziej łagodne w tym temacie, ponieważ to wewnętrzny styl Microsoftu polega na stosowaniu podkreślenia przed zmiennymi prywatnymi członkami (przynajmniej w języku C #). Wiem, że g ++ może nadal mieć problemy z wiodącymi znakami podkreślenia.
KChaloux
6
Przydatne mogą być odpowiedzi na to pytanie .
Blrfl,
1
@KChaloux, jeśli uważasz, że zespół kompilatora C ++ firmy Microsoft, istniejący od ponad 20 lat, ustanowił zasady dotyczące akceptowalnych nazw identyfikatorów w oparciu o przyzwyczajenia niektórych członków zespołu C #, nie wiesz, jak działa Microsoft :-). Poważnie, minęło 21 lat, odkąd wypuścili swój pierwszy kompilator C ++, a te zasady sięgają tak daleko lub dalej do oryginalnej bazy kodu kompilatora C.
Kate Gregory
@ Kate Właśnie wskazałem, że wiedziałem, że używali go w C #. Nie korzystam z kompilatora C ++ Microsoftu ani nie znam się tam na temat środowiska, więc wywnioskowałem, że używają tego stylu nazewnictwa w C ++ na podstawie mojego doświadczenia z C #. Nigdy nie zrobiłem żadnych roszczeń, że reguła C # był pierwszy.
KChaloux

Odpowiedzi:

17

Najwyraźniej nie rozumiesz, dlaczego podkreślenia przedrostków są złą praktyką. Krótko mówiąc, dzieje się tak, ponieważ standard C i C ++ rezerwują te prefiksy dla szczegółów implementacji, na przykład dla standardowej implementacji biblioteki. (zauważ, że _ i __ nie są zarezerwowane na te same rzeczy, patrz komentarze)

Nawet jeśli nazwy są objęte zakresem (przestrzeń nazw, klasa itp.), Mogą istnieć pewne nazwy globalne, w szczególności makra, które używają tych prefiksów i mogą po cichu uszkodzić kod, jeśli je również użyjesz.

Zasadniczo więc przez większość czasu można bezpiecznie używać tych prefiksów, ALE jeśli ich nie użyjesz, masz 100% gwarancji, że twoja nazwa nigdy nie będzie kolidować z nazwami implementacji.

Dlatego w razie wątpliwości nie używaj tych prefiksów.

Klaim
źródło
3
twoje komentarze dotyczą przedrostka dwóch podkreślników, ale nie jednego podkreślenia
Kate Gregory
1
@KateGregory: Nazwy z wiodącym podkreśleniem są zarezerwowane do wykorzystania przez implementację dla nazw w globalnej przestrzeni nazw. Wiodący znak podkreślenia, po którym następuje drugi znak podkreślenia lub kapitał, są zarezerwowane do dowolnego użytku (mogą być używane do makr przez implementację). Tak więc wiodący znak podkreślenia, po którym następuje mała litera, może być odpowiedni w lokalnych zakresach, ale najlepiej unikać tego, aby uniknąć potknięcia i używania zastrzeżonej nazwy.
Bart van Ingen Schenau
4
@KateGregory: Jako członek _limitnie jest błędem, ale jest funkcją globalną. Myślę, że lepiej jest mieć prostą zasadę, która mówi „nie używaj wiodących znaków podkreślenia bez wyjątku” niż zasadę, która pozwala im w niektórych kontekstach, a nie w innych. Ale możemy zgodzić się na to. I dla jasności, nie mam problemów z podkreśleniami w innych miejscach niż na samym początku.
Bart van Ingen Schenau
2
@BartvanIngenSchenau: tylko dla zainteresowania: prosta polityka typu „używaj wiodących znaków podkreślenia tylko i wyłącznie dla członków klasy prywatnej” nie powinna prowadzić do problemów technicznych. Jak myślisz, czy to prawda?
Doc Brown
1
@KateGregory Aby wyjaśnić, zgadzam się, że zasady są bardziej precyzyjne niż to, co mówię w mojej odpowiedzi; ale odzwierciedla brak precyzji mojej pamięci, kiedy próbuję zapamiętać, jakie są dokładnie reguły. Ponieważ staram się unikać konieczności poznawania wyjątków (nie funkcji), wolę ogólne zasady łatwe do przestrzegania, w szczególności w przypadku takich mało ważnych reguł. Zabawne jest to, że łatwiej mi się poruszać semantycznie niż pamiętać o tym. Może teraz nie jest fajnie, kiedy o tym myślę ...
Klaim,
16

Korzystanie z dwóch znaków podkreślenia jest zdecydowanie złe - jest to zarezerwowane dla szczegółów implementacyjnych specyficznych dla kompilatora. Nie dotyczy to użycia jednego podkreślenia.

Niektóre osoby nie znoszą podkreśleń. Bez względu na to, czy dzwonisz, m_indexczy highest_priceteż _a- oni tego nie znoszą. Pracowałem z kimś 25 lat temu, który powiedział mi o konkretnej drukarce IBM (bardzo popularnej), która mieści więcej linii na stronie, pomijając dolny piksel w każdej innej linii. Było to dobre w przypadku notatek lub wyników z dużej liczby liczb i tym podobnych, ale miało wpływ na kod powodujący, że połowa twoich znaków podkreślenia była niewidoczna. (Tak, naprawdę!) Ludzie z tego pokolenia mają na ogół irracjonalną nienawiść do podkreślania, albo przez interakcję z tą drukarką, albo przez pracę z kimś, kto się w nią wkurza, że ​​podkreślenia nie powinny być używane.

Większość osób uważa, stosując mieszane sprawy (opcja nie mieliśmy w, powiedzmy, Fortran) bardziej czytelny podejście: mIndex, HighestPrice, awstać dość dobrze do wcześniej podkreślonego przykładów. Dam ci dwie zasady:

  • nigdy nie uruchamiaj niczego (funkcja, zmienna, makro, typedef) z dwoma znakami podkreślenia
  • wybierz spójną konwencję (np. _limitdla parametrów funkcji, m_limitdla zmiennych składowych, nigdy nie używaj podkreślenia, wielbłąda, wielkie litery każdego słowa, węgierski, coś ) i trzymaj się tego. Nie przejmuj się czasami podkreśleniami na początku, czasem na końcu, czasem ich nie używaj i pięcioma różnymi konwencjami obudów. Bądź konsekwentny.

Ta drukarka już dawno zniknęła. Jeśli chcesz użyć jednego podkreślenia na raz, nie krępuj się. Ale zrozum, nienawiści podkreślające wciąż istnieją.

Kate Gregory
źródło
„Niezależnie od tego, czy nazywasz coś m_index, najwyższa cena, czy _a - oni tego nie znoszą” Nie bez powodu! Nie wspomniałeś o tym, że istnieją normy w standardach odnoszące się konkretnie do użycia wiodących znaków podkreślenia w identyfikatorach. Po co prosić o kłopoty, skoro tak łatwo ich uniknąć? stackoverflow.com/a/228797
Max Barraclough
nie wspomniał? Przeczytaj pierwsze zdanie jeszcze raz.
Kate Gregory
„To nie dotyczy użycia jednego podkreślenia” nie jest całą historią, patrz mój link, który mówi, że prowadzenie z podwójnymi podkreśleniami jest dość wyraźnym „nie”, ale „Zastrzeżone w globalnej przestrzeni nazw: identyfikatory rozpoczynające się od podkreślać". Po co bawić się ogniem?
Max Barraclough
1
ok, brakuje ci sensu. Drugi akapit omawia istnienie ludzi, którzy są ogólnie przeciwni podkreśleniu. Nie prowadzi podkreślenia. Wszystkie podkreślenia. Tak, to prawda, że ​​oprócz reguły dotyczącej dwóch znaków podkreślenia istnieje również zasada dotycząca wiodących znaków podkreślenia, po których następuje wielka litera, wiodących znaków podkreślenia w skali globalnej itp. Ale poza tym niektórzy i tak nienawidzą znaków podkreślenia. A tych ludzi lubię nazywać błędnymi. Nie ma opartego na standardach powodu, by sprzeciwić się prowadzeniu podkreślenia. Ale ludzie i tak to robią.
Kate Gregory
Tam się nie zgadzamy. Tak, czasem legalne jest rozpoczynanie identyfikatora pojedynczym podkreśleniem. Jak już wspomniałem powyżej, po co bawić się ogniem? Nigdy nie zaczynam identyfikatora znakiem podkreślenia; Widzę to jako zapach kodu (jeśli można powiedzieć, że „widzi” zapach :-P). W ten sposób nigdy nie martwię się o szczegóły zasad, które mówią mi dokładnie, kiedy jest to zgodne z prawem.
Max Barraclough,