Identyfikatory
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.
Ta sekcja jest niedokończona. Powód: +zawartość punktu 17.6.4.3 standardu C++ [reserved.names] |
[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:
- nazwa przeładowanego operatora w notacji funkcyjnej (n.p. operator+ czy operator new);
- nazwa operatora rzutowania zdefiniowanego przez użytkownika (n.p. operator bool);
- nazwa szablonu wraz z jego listą argumentów (n.p. MojSzablon<int>);
- znak ~ poprzedzający nazwę klasy (n.p. ~MojaKlasa);
- znak ~ poprzedzający znacznik decltype (n.p. ~decltype(str)).
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 |