2011-11-02 19 views
6

W naszych projektach zdecydowaliśmy się na prefiksowanie zmiennych składowych i niektórych prywatnych/chronionych metod za pomocą podkreślenia (czyli "_").Członkowie klasy z prefiksem (_)

Podczas dyskusji twierdzono, że jest to odradzane z powodu pewnych niekompatybilności z niektórymi kompilatorami/linkerami na niektórych platformach. Chcemy być pewni, ponieważ chcemy być przenośni jak tylko się da.

Również uważam, że that prefixing globals with underscores in C może być problem.

Czy to samo dotyczy połączenia C++, a jeśli tak, to w jakich przypadkach (platformy/kompilatory/konsolidatory)?

Odpowiedz

11

od standardu C++ 03: §17.4.3.1.2/1

Niektóre zestawy nazwiskami i podpisami funkcyjnych są zawsze zarezerwowane do realizacji:

  • Każda nazwa, która zawiera podwójny podkreślnik (__) lub zaczyna się od podkreślenia poprzedzonego wielką literą (2.11) i jest zarezerwowany dla implementacji do dowolnego użytku.

  • Każda nazwa zaczynająca się od podkreślenia jest zarezerwowana dla implementacji do użycia jako nazwa w globalnej przestrzeni nazw.

Równowartość tekst jest obecny w C++ 11 §17.6.4.3.2/1

+8

+1. Innymi słowy, użycie OP jest bezpieczne, * o ile * członkowie nie zaczynają od dużej litery. Ale polecam ogólnie w odniesieniu do wiodących podkreśleń, ponieważ zbyt łatwo jest przypadkowo złamać jedną z przedstawionych tu zasad. – jalf

+1

Całkowicie zgadzam się z @jalf. Jeśli chcesz, użyj innego prefiksu, np. 'M_' ... –

+3

To są oficjalne zasady. W przeszłości miałem problemy z makrami w plikach nagłówków systemu, które pasują do nazw zaczynających się od znaku podkreślenia, po którym następuje mała litera. Zasadniczo dla czytelności należy unikać podkreślenia na każdym końcu symbolu. –

2

Proszę również spojrzeć tutaj: What are the rules about using an underscore in a C++ identifier?

Widziałem dużo kodu przy użyciu pojedyncze podkreślenia jako przedrostek lub podwójne podkreślenia w indentyfikatorze i po prostu działało. Ale nigdy nie wiesz. Identyfikatory są zarezerwowane i wszystko może się zdarzyć, w zależności od kompilatora.

4

Osobiście używam m_name, gdzie "m" oznacza "członek".

Nawiasem mówiąc, używam również p_ dla parametrów w moich funkcjach i g_ dla kilku nieuniknionych globali.

(wtedy I zazwyczaj bashed przez więc użytkownicy, ponieważ wygląda notacja węgierska ;-) Ale tak nie jest.)

+2

i obniżone;) – mlvljr

+3

@mlvljr dziękuję za ten konstruktywny komentarz, który pomaga mi i społeczności;) To nie jest notacja węgierska, ale jest błędnie rozumiane przez ludzi, których nauczono "notacja węgierska jest zła" i stosują tę zasadę bez myślenia. – Offirmo

+0

Naprawdę wątpię, aby kreacje Charlesa Simonyi mogły być "złe", btw (może być dla tych, którzy nie myślą) – mlvljr

Powiązane problemy