Aufbau von Bezeichnern in C++
Ein Bezeichner, wie beispielsweise der Bezeichner "ax_d22", kann kleine und große lateinische Buchstaben, Ziffern, den Grundstrich "_" und universelle Zeichennamen enthalten, darf aber nicht mit einer Ziffer beginnen.
Die Bezeichner der Programmiersprache C++ sind 〈identifier 〉 gemäß der folgenden Spezifikation.
- 〈identifier 〉 ::=
- 〈nondigit 〉 |
〈identifier 〉 〈nondigit 〉 |
〈identifier 〉 〈digit 〉. - 〈nondigit 〉 ::=
- 〈universal-character-name 〉 |
'_' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' |
'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' |
'v' | 'w' | 'x' | 'y' | 'z' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' |
'G' | 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' |
'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z'. - 〈digit 〉 ::=
- '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'.
Übungsfragen Warum ist die Zeichenfolge "8" kein Bezeichner? Warum ist die Zeichenfolge "_" ein Bezeichner? Warum ist die Zeichenfolge "AB" ein Bezeichner?
Die Länge von Bezeichnern ist durch die Sprache nicht begrenzt. Alle verwendeten Zeichen, einschließlich ihrer Groß- oder Kleinschreibung, werden zur Unterscheidung eines Bezeichners von anderen Bezeichnern herangezogen.
Das Nichtterminalsymbol 〈universal-character-name 〉 wird weiter unten behandelt.
Schlüsselwörter
Ein Bezeichner darf kein Schlüsselwort sein.
Die Schlüsselwörter von C++ sind "asm", "auto", "bool", "break", "case", "catch", "char", "class", "const", "const_cast", "continue", "default", "delete", "do", "double", "dynamic_cast", "else", "enum", "explicit", "export", "extern", "false", "float", "for", "friend", "goto", "if", "inline", "int", "long", "mutable", "namespace", "new", "operator", "private", "protected", "public", "register", "reinterpret_cast", "return", "short", "signed", "sizeof", "static", "static_cast", "struct", "switch", "template", "this", "throw", "true", "try", "typedef", "typeid", "typename", "union", "unsigned", "using", "virtual", "void", "volatile", "wchar_t" und "while".
Alternativschreibweisen
Alternativschreibweisen (für bestimmte Operatoren und Punktuatoren) dürfen ebenfalls nicht als Bezeichner verwendet werden.
Die Alternativschreibweisen sind "and", "and_eq", "bitand", "bitor", "compl", "not", "not_eq", "or", "or_eq", "xor" und "xor_eq".
Reservierte Bezeichner
Bestimmte Namen sind für die Implementation reserviert, sie dürfen also nicht in einer C++ -Übersetzungseinheit definiert werden. Etwas vereinfacht, handelt es sich um folgende Namen:
- Namen, die einen Doppelgrundstrich "__" enthalten,
- Namen, die mit einem Grundstrich "_" beginnen und im globalen Namensraume liegen oder bei denen dem Grundstriche ein großer Buchstabe folgt und
- Namen, die von der Standardbibliothek definiert werden.
Damit sind also beispielsweise die Namen »abc__def«, »_GHI« und »cos« reserviert.
- ISO/IEC 14882:2003(E) 17.4.3.1.2 [lib.global.names] Global names
- 1 Certain sets of names and function signatures are always reserved to the implementation:
- — Each name that contains a double underscore (_ _) or begins with an underscore followed by an upper-case letter (2.11) is reserved to the implementation for any use.
- — Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace.
Ein Programm darf außerdem keine Namen im Namensraum »::std« definieren.
- ISO/IEC 14882:2003(E) 17.4.3.1 [lib.reserved.names] Reserved names
- 1 It is undefined for a C++ program to add declarations or definitions to namespace std or namespaces within namespace std unless otherwise specified.
Zeichen nach der Norm ISO 10646
Beim ersten Lesen dieses Textes kann die nun beschriebene Möglichkeit der Verwendung des Symbols 〈universal-character-name 〉 ignoriert werden.
Ein 〈universal-character-name 〉 in einem Bezeichner steht für einen Buchstaben nach ISO 10646. Für die Verwendung gelten einige Einschränkungen, die hier nicht wiedergegeben sind. Durch die Möglichkeit der Verwendung solcher Buchstaben wird es ermöglicht, eine größere Menge von Buchstaben in Bezeichnern zu verwenden und diese dann als 〈universal-character-name 〉 im Quellcode darzustellen.
- 〈universal-character-name 〉 ::=
- '\u' 〈hexquad 〉 |
'\U' 〈hexquad 〉 〈hexquad 〉. - 〈hexquad 〉 ::=
- 〈hexadecimaldigit 〉 〈hexadecimaldigit 〉 〈hexadecimaldigit 〉 〈hexadecimaldigit 〉.
- 〈hexadecimal-digit 〉 ::=
- '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' |
'a' | 'b' | 'c' | 'd' | 'e' | 'f' |
'A' | 'B' | 'C' | 'D' | 'E' | 'F'.
C -Standardbezeichner
In C++ sind Namen der aus der Programmiersprache C übernommene C90 -Standardbibliothek reserviert. Die groß geschriebenen Makronamen sind reserviert, wenn der entsprechende Kopf eingebunden wurde. Klein geschriebene Namen von Objekten und Funktionen mit externer Bindung sind grundsätzlich reserviert. Diese Namen dürfen also nicht umdefiniert werden (jedenfalls nicht innerhalb des globalen Namensraumes).
Die reservierten Bezeichner sind "_IOFBF", "_IOLBF", "_IONBF", "abort", "abs", "acos", "acosf", "acosl", "and", "and_eq", "asctime", "asin", "asinf", "asinl", "assert", "atan", "atan2", "atan2f", "atan2l", "atanf", "atanl", "atexit", "atof", "atoi", "atol", "bitand", "bitor", "bsearch", "btowc", "BUFSIZ", "calloc", "ceil", "ceilf", "ceill", "CHAR_BIT", "CHAR_MAX", "CHAR_MIN", "clearerr", "clock", "clock_t", "CLOCKS_PER_SEC", "compl", "cos", "cosf", "cosh", "coshf", "coshl", "cosl", "ctime", "DBL_DIG", "DBL_EPSILON", "DBL_MANT_DIG", "DBL_MAX", "DBL_MAX_10_EXP", "DBL_MAX_EXP", "DBL_MIN", "DBL_MIN_10_EXP", "DBL_MIN_EXP", "difftime", "div", "div_t", "EDOM", "EILSEQ", "EOF", "ERANGE", "errno", "exit", "EXIT_FAILURE", "EXIT_SUCCESS", "exp", "expf", "expl", "fabs", "fabsf", "fabsl", "fclose", "feof", "ferror", "fflush", "fgetc", "fgetpos", "fgets", "fgetwc", "fgetws", "FILE", "FILENAME_MAX", "floor", "floorf", "floorl", "FLT_DIG", "FLT_EPSILON", "FLT_MANT_DIG", "FLT_MAX", "FLT_MAX_10_EXP", "FLT_MAX_EXP", "FLT_MIN", "FLT_MIN_10_EXP", "FLT_MIN_EXP", "FLT_RADIX", "FLT_ROUNDS", "fmod", "fmodf", "fmodl", "fopen", "FOPEN_MAX", "fpos_t", "fprintf", "fputc", "fputs", "fputwc", "fputws", "fread", "free", "freopen", "frexp", "frexpf", "frexpl", "fscanf", "fseek", "fsetpos", "ftell", "fwide", "fwprintf", "fwrite", "fwscanf", "getc", "getchar", "getenv", "gets", "getwc", "getwchar", "gmtime", "HUGE_VAL", "HUGE_VALF", "HUGE_VALL", "INFINITY", "INT_MAX", "INT_MIN", "isalnum", "isalpha", "iscntrl", "isdigit", "isgraph", "islower", "isprint", "ispunct", "isspace", "isupper", "iswalnum", "iswalpha", "iswcntrl", "iswctype", "iswdigit", "iswgraph", "iswlower", "iswprint", "iswpunct", "iswspace", "iswupper", "iswxdigit", "isxdigit", "jmp_buf", "L_tmpnam", "labs", "LC_ALL", "LC_COLLATE", "LC_CTYPE", "LC_MONETARY", "LC_NUMERIC", "LC_TIME", "lconv", "LDBL_DIG", "LDBL_EPSILON", "LDBL_MANT_DIG", "LDBL_MAX", "LDBL_MAX_10_EXP", "LDBL_MAX_EXP", "LDBL_MIN", "LDBL_MIN_10_EXP", "LDBL_MIN_EXP", "ldexp", "ldexpf", "ldexpl", "ldiv", "ldiv_t", "localeconv", "localtime", "log", "log10", "log10f", "log10l", "logf", "logl", "LONG_MAX", "LONG_MIN", "longjmp", "malloc", "MB_CUR_MAX", "MB_LEN_MAX", "mblen", "mbrlen", "mbrtowc", "mbsinit", "mbsrtowcs", "mbstate_t", "mbstowcs", "mbtowc", "memchr", "memcmp", "memcpy", "memmove", "memset", "mktime", "modf", "modff", "modfl", "NDEBUG", "not", "not_eq", "NULL", "NULL", "NULL", "NULL", "NULL", "NULL", "NULL", "offsetof", "or", "or_eq", "perror", "pow", "powf", "powl", "printf", "ptrdiff_t", "putc", "putchar", "puts", "putwc", "putwchar", "qsort", "raise", "rand", "RAND_MAX", "realloc", "remove", "rename", "rewind", "scanf", "SCHAR_MAX", "SCHAR_MIN", "SEEK_CUR", "SEEK_END", "SEEK_SET", "setbuf", "setjmp", "setlocale", "setvbuf", "SHRT_MAX", "SHRT_MIN", "sig_atomic_t", "SIG_DFL", "SIG_ERR", "SIG_IGN", "SIGABRT", "SIGFPE", "SIGILL", "SIGINT", "signal", "SIGSEGV", "SIGTERM", "sin", "sinf", "sinh", "sinhf", "sinhl", "sinl", "size_t", "size_t", "size_t", "size_t", "size_t", "size_t", "sprintf", "sqrt", "sqrtf", "sqrtl", "srand", "sscanf", "stderr", "stdin", "stdout", "strcat", "strchr", "strcmp", "strcoll", "strcpy", "strcspn", "strerror", "strftime", "strlen", "strncat", "strncmp", "strncpy", "strpbrk", "strrchr", "strspn", "strstr", "strtod", "strtok", "strtol", "strtoul", "strxfrm", "swprintf", "swscanf", "system", "tan", "tanf", "tanh", "tanhf", "tanhl", "tanl", "time", "time_t", "tm", "tm", "TMP_MAX", "tmpfile", "tmpnam", "tolower", "toupper", "towctrans", "towlower", "towupper", "UCHAR_MAX", "UINT_MAX", "ULONG_MAX", "ungetc", "ungetwc", "USHRT_MAX", "va_end", "va_list", "va_start", "vfprintf", "vfwprintf", "vprintf", "vsprintf", "vswprintf", "vwprintf", "WCHAR_MAX", "WCHAR_MIN", "wchar_t", "wchar_t", "wchar_t", "wcrtomb", "wcscat", "wcschr", "wcscmp", "wcscoll", "wcscpy", "wcscspn", "wcsftime", "wcslen", "wcsncat", "wcsncmp", "wcsncpy", "wcspbrk", "wcsrchr", "wcsrtombs", "wcsspn", "wcsstr", "wcstod", "wcstok", "wcstol", "wcstombs", "wcstoul", "wcsxfrm", "wctob", "wctomb", "wctrans", "wctrans_t", "wctype", "wctype_t", "WEOF", "wint_t", "wint_t", "wmemchr", "wmemcmp", "wmemcpy", "wmemmove", "wmemset", "wprintf", "wscanf", "xor" und "xor_eq".