Przestrzenie nazw
Warianty
Działania

Identyfikatory

Z cppreference.com
< cpp‎ | language

Identyfikator to dowolna sekwencja cyfr, podkreślników (_), małych i dużych liter alfabetu łacińskiego oraz większości znaków Unicode (szczegóły poniżej). Poprawny identyfikator nie może zaczynać się cyfrą. Identyfikatory rozróżniają małe i duże litery (case sensitive) oraz każdy znak w sekwencji jest brany pod uwagę.

Uwaga: Formalnie, gramatyka C++ wymaga, by wszystkie były oznaczone znakiem specjalnym\u albo \U, ale dzięki pierwszej fazie translacji, znaki systemu Unicode przetwarzane są na taką reprezentację przez preprocesor. Należy jednak pamiętać, że wparcie dla takiego przetwarzania jest ograniczone, n.p. gcc

Spis treści

[edytuj]Identyfikatory jako deklaracje

Identyfikator może zostać użyty jako nazwa obiekty, referencje, funkcje, enumeratory, typy, składowe klas, przestrzenie nazw, szablony, specjalizacje szablonów, pakiety parametrów, etykiety goto oraz inne byty. Od tej reguły istnieją następujące wyjątki:

  • identyfikatory będące słowami kluczowymi nie mogą być użyte w żaden inny sposób
  • identyfikatory zawierające podwójny podkreślnik w na jakiejkolwiek pozycji są zarezerwowane
  • identyfikatory zaczynające się podkreślnikiem a następnie dużą literą są zarezerwowane
  • identyfikatory zaczynające się podkreślnikiem są zarezerwowane w globalnej przestrzeni nazw

"Zarezerowowane" w powyższym opisie oznacza, że nagłowki biblioteki standardowej mogą użyć powyższych identyfikatów w deklaracjach lub dyrektywach $define na swoje wewnętrzne potrzeby, kompilator może predefiniować niestandardowe identyfikatory tego typu. Z tego powodu algorytmy przetwarzania nazw (name mangling) używane przez kompilator mogą przyjąć, że tego typu identyfikatory nie będą użyte w programie. Z tego powodu jeżeli program używa takich nazw, mamy do czynienia z niezdefiniowanym zachowaniem.

Dodatkowo, niezdefiniowanym zachowaniem jest używanie w dyrektywach #define oraz #undef nazw identycznych ze słowami kluczowymi. Jeżeli program załącza jakikolwiek z nagłówków bilioteki standardowej używając dyrektywy #include, niezdefiniowanym zachowaniem jest także użycie w dyrektywach #define oraz #undef identyfikatorów identycznych z nazwami zadeklarowanymi w bibliotece standardowej.

[edytuj]Identyfikatory jako wyrażenia

Jeżeli identyfikator jest nazwą zmiennej, funkcji albo enumeratora, to taki identyfikator może zostać użyty jako wyrażenie. Wyrażenie składające się jedynie z identyfikatora zwraca wartość bytu określanego przez ten identyfikator. Kategoria wartości takiego wyrażenia to l-wartość jeżeli identyfikator określa funkcję, zmienną lub składową danych. W przeciwnym wypadku takie wyrażenie jest pr-wartością (n.p. pr-wartością jest enumerator).

W ciele nie-statycznej funkcji składowej, każdy identyfikator nazywający nie-statyczną składową klasy jest niejawnie transformowany do wyrażenia dostępu do składowych this->składowa.

[edytuj]Identyfikatory niekwalifikowane

Poza odpowiednio zadeklarowanymi identyfikatorami, następujące elementy mogą być użyte w wyrażeniach w tej samej roli:

Razem z identyfikatorami, powyższe wyrażenia określane są jako niekwalifikowane wyrażenia identyfikacyjne (unqualified id-expressions).

[edytuj]Identyfikatory kwalifikowane

Kwalifikowane wyrażenie identyfikacyjne (qualified id-expression) powstają z wyrażeń niekwalifikowanych poprzez poprzedzenie ich operatorem zakresu :: oraz opcjonalnie sekwencją nazw enumeracji(od C++11), klas oraz pzestrzeni nazw oraz wyrażeń decltype(od C++11) rozdzielonych operatorem zakresu. Przykładowo, wyrażenie std::string::npos jest nazwą odnoszącą się do statycznej składowej npos w klasie string w przestrzeni nazw std. Wyrażenie ::tolower nazywa funkcję tolower w globalnej przestrzeni nazw. Wyrażenie std::cout odnosi się do globalnego obiektu cout w przestrzeni nazw std, będącej przestrzenią nazw najwyższego poziomu. Wyrażenie boost::signals2::connection odnosi się do typu connection, znajdującego się w przestrzeni nazw signals2, która z kolei jest zadeklarowana przestrzeni nazw boost.

Słowo kluczowe template może wystąpić w identyfikatoach kwalifikowanych jeżeli zachodzi konieczność ujednoznacznienia nazw szablonów zależnych.

Strona wyszukiwanie kwalifikowane zawiera szczegóły wyszukiwania nazw dla identyfikatorów kwalifikowanych.

[edytuj]Nazwy

Nazwa to użycie jednego z poniższych sposobów do odniesienia się do bytu lub etykiety:

  • identyfikator;
  • przeładowany operator w notacji funkcyjnej (operator+, operator new);
  • operator konwersji zdefiniowany przez użytkownika (operator bool);
  • operator literału zdefiniowany przez użytkownika (operator "" _km);
  • nazwa szablonu wraz z jego listą argumentów (MojSzablon<int>).

Każda nazwa odnosząca się dowolnego bytu w programie jest wprowadzana do programu poprzez deklarację. Każda nazwa oznaczająca etykietę jest wprowadzana do programu poprzez wyrażenie goto albo wyrażenie etykiety. Różne użycia tej samej nazwy w więcej niż jednej jednostce translacji mogą odnosić się do różnych lub tych samych bytów w zależności od sposobu linkowania.

W momencie kiedy kompilator napotyka nieznaną nazwę w programie, dopasowanie jej do odpowiedniej deklaracji odbywa się przez proces wyszukiwania nazw. Wyjątek stanowi wyszukiwanie nazw zależnych w deklaracjach i definicjach szablonów. Dla nazw zależnych kompilator ustala czy odnoszą się one do typu, szablonu, czy innego bytu i czy potrzebne jest jawne ujednoznaczenienie nazwy (explicit disambiguation).


[edytuj]Znaki Unicode w identyfikatorach

Znaki z poniższych zakresów są dopuszczalne w identyfikatorach:

Code points Opis Znaki
U+00A8 DIARESIS ¨
U+00AA FEMININE ORDINAL INDICATOR ª
U+00AD SOFT HYPHEN ­
U+00AF MACRON ¯
U+00B2 - U+00B5 SUPERSCRIPT TWO - MICRO SIGN ²³´µ
U+00B7 - U+00BA MIDDLE DOT - MASCULINE ORDINAL INDICATOR ·¸¹º
U+00BC - U+00BE VULGAR FRACTION ONE QUARTER - VULGAR FRACTION THREE QUARTERS ¼½¾
U+00C0 - U+00D6 LATIN CAPITAL LETTER A WITH GRAVE - LATIN CAPITAL LETTER O WITH DIAERESIS ÀÁÂ...ÔÕÖ
U+00D8 - U+00F6 LATIN CAPITAL LETTER O WITH STROKE - LATIN SMALL LETTER O WITH DIAERESIS ØÙÚ...ôõö
U+00F8 - U+167F LATIN SMALL LETTER O WITH STROKE - CANADIAN SYLLABICS BLACKFOOT W øùú...ᙽᙾᙿ
U+1681 - U+180D OGHAM LETTER BEITH - MONGOLIAN FREE VARIATION SELECTOR THREE ᚁᚂᚃ...᠋᠌᠍
U+180F - U+1FFF SYRIAC LETTER BETH - GREEK DASIA ᠏ܒܓ...´῾🿾
U+200B - U+200D ZERO WIDTH SPACE - ZERO WIDTH JOINER ​‌‍
U+202A - U+202E LEFT-TO-RIGHT EMBEDDING - RIGHT-TO-LEFT OVERRIDE
U+203F - U+2040 UNDERTIE - CHARACTER TIE ‿⁀
U+2054 INVERTED UNDERTIE
U+2060 - U+218F WORD JOINER - TURNED DIGIT THREE ...↉↊↋
U+2460 - U+24FF CIRCLED DIGIT ONE - NEGATIVE CIRCLED DIGIT ZERO ①②③...⓽⓾⓿
U+2776 - U+2793 DINGBAT NEGATIVE CIRCLED DIGIT ONE - DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN ❶❷❸...➑➒➓
U+2C00 - U+2DFF GLAGOLITIC CAPITAL LETTER AZU - COMBINING CYRILLIC LETTER IOTIFIED BIG YUS ⰀⰁⰂ...
U+2E80 - U+2FFF CJK RADICAL REPEAT - IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID ⺀⺁⺂...⿹⿺⿻
U+3004 - U+3007 JAPANESE INDUSTRIAL STANDARD SYMBOL - IDEOGRAPHIC NUMBER ZERO 〄々〆〇
U+3021 - U+302F HANGZHOU NUMERAL ONE - HANGUL DOUBLE DOT TONE MARK 〡〢〣...
U+3031 - U+D7FF VERTICAL KANA REPEAT MARK - HANGUL JONGSEONG PHIEUPH-THIEUTH ...
U+F900 - U+FD3D CJK COMPATIBILITY IDEOGRAPH-F900 - ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM 豈更車...ﴻﴼﴽ
U+FD40 - U+FDCF ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM -
ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
U+FDF0 - U+FE44 ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM -
PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
...﹂﹃﹄
U+FE47 - U+FFFD PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET - REPLACEMENT CHARACTER ﹇﹈﹉...�
U+10000 - U+1FFFD LINEAR B SYLLABLE B008 A - CHEESE WEDGE (U+1F9C0)
U+20000 - U+2FFFD <CJK Ideograph Extension B, First> - CJK COMPATIBILITY IDEOGRAPH-2FA1D (U+2FA1D)
U+30000 - U+3FFFD
U+40000 - U+4FFFD
U+50000 - U+5FFFD
U+60000 - U+6FFFD
U+70000 - U+7FFFD
U+80000 - U+8FFFD
U+90000 - U+9FFFD
U+A0000 - U+AFFFD
U+B0000 - U+BFFFD
U+C0000 - U+CFFFD
U+D0000 - U+DFFFD
U+E0000 - U+EFFFD LANGUAGE TAG (U+E0001) - VARIATION SELECTOR-256 (U+E01EF)


Znaki z poniższych zakresów nie są dopuszczalne w identyfikatorach:

Code points Opis Znaki
U+0300 - U+036F COMBINING GRAVE ACCENT - COMBINING LATIN SMALL LETTER X
U+1DC0 - U+1DFF COMBINING DOTTED GRAVE ACCENT - COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
U+20D0 - U+20FF COMBINING LEFT HARPOON ABOVE - COMBINING ASTERISK ABOVE
U+FE20 - U+FE2F COMBINING LIGATURE LEFT HALF - COMBINING CYRILLIC TITLO RIGHT HALF

[edytuj]Zobacz także

C documentation for identifier
close