Aufbau von Bezeichnern in C
Ein Bezeichner, wie beispielsweise der Bezeichner "ax_d22", kann aus kleinen und großen lateinischen Buchstaben, Ziffern, dem Grundstrich "_" und eventuell noch implementationsdefinierten Zeichen bestehen und darf nicht mit einer Ziffer beginnen. Die Verwendung implementationsspezifischer Zeichen sollte vermieden werden, weil sie die Portabilität beeinträchtigt.
- 〈identifier 〉 ::=
- 〈identifier-nondigit 〉 |
〈identifier 〉 〈identifier-nondigit 〉 |
〈identifier 〉 〈digit 〉. - 〈identifier-nondigit 〉 ::=
- 〈nondigit 〉 |
〈universal-character-name 〉 |
〈other implementation-defined characters 〉. - 〈nondigit 〉 ::=
- '_' | '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'.
(Das Nichtterminalsymbol 〈universal-character-name 〉 wird weiter unten behandelt.)
Groß- und Kleinschreibung ist in C signifikant. Mindestens die ersten 31 Zeichen eines Bezeichner sind signifikant, es gibt keine Grenze für die Länge eines Bezeichners.
Schlüsselwörter
Schlüsselwörter dürfen nicht als Bezeichner verwendet werden.
Die Schlüsselwörter sind "_Bool", "_Complex", "_Imaginary", "auto", "break", "case", "char", "const", "continue", "default", "do", "double", "else", "enum", "extern", "float", "for", "goto", "if", "inline", "int", "long", "register", "restrict", "return", "short", "signed", "sizeof", "static", "struct", "switch", "typedef", "union", "unsigned", "void", "volatile" und "while".
Reservierte Bezeichner
Bestimmte Bezeichner sind für die Implementation reserviert, sie dürfen also nicht in einer C++ -Übersetzungseinheit definiert werden. Etwas vereinfacht, handelt es sich um folgende Bezeichner:
- Bezeichner, die mit einem Grundstrich "_" beginnen und
- Bezeichner, die von der Standardbibliothek definiert werden.
- bestimmte Bezeichner, die von zukünftigen Versionen der Standardbibliothek definiert werden könnten.
Damit sind also beispielsweise die Bezeichner "_ghi" und "cos" reserviert.
Die Vereinfachung der hier genannten Regeln bewirkt, daß diese etwas stärker sind als notwendig: In bestimmten Fällen können Bezeichner, die mit einem Grundstrich beginnen oder die von der Standardbibliothek definiert werden, doch als Bezeichner verwendet werden. Doch für den Anfang sollten diese etwas vereinfachten Regeln ausreichen, um Konflikte mit reservierten Bezeichnern zu vermeiden.
Weitere reservierte Namen
Zur Verwendung in zukünftigen Versionen der Sprache werden folgende Namen für Implementationen reserviert:
- die Makronamen "bool", "true" und "false", die in C99 noch umdefiniert werden dürfen (Kopf "<stdbool.h>").
- Funktionsnamen, die mit dem Text "str", dem Text "mem" oder dem Text "wcs" beginnen, wenn darauf noch ein kleiner Buchstabe folgt (Kopf "<stdlib.h>", Kopf "<string.h>", Kopf "<wchar.h>"),
- Funktionsnamen, die mit dem Text "is" oder dem Text "to" beginnen, wenn darauf noch ein kleiner Buchstabe folgt (Kopf "<ctype.h>", Kopf "<wctype.h>"),
- Makronamen, die mit dem Buchstaben "E" und einer Ziffer oder dem Buchtstaben "E" und einem großen Buchstaben beginnnen (Kopf "<errno.h>"),
- Makronamen, die mit dem Text "PRI" oder dem Text "SCN" beginnnen, wenn auf diesen Text noch ein kleiner Buchstabe oder der Buchstabe "X" folgt (Kopf "<inttypes.h>"),
- Makronamen, die mit dem Text "LC_" und einem großen Buchstaben beginnen (Kopf "<locale.h>"),
- Makronamen, die mit dem Text "SIG" und einem großen Buchstaben oder dem Text "SIG_" und einem großen Buchstaben beginnen (Kopf "<signal.h>"),
- Typnamen (mit dem Schlüsselwort "typdef" definiert), die mit dem Text "int" oder dem Text "uint" beginnen und mit dem Text "_t" enden (Kopf "<stdint.h>"),
- Makronamen, die mit dem Text "INT" oder dem Text "UINT" beginnen und mit dem Text "_MAX", dem Text "_MIN" oder dem Text "_C" enden (Kopf "<stdint.h>") und
- der Funktionsname "cerf", "cexpm1", "clog2", "cerfc", "clog10", "clgamma", "cexp2", "clog1p" und "ctgamma", sowie diese Funktionsnamen mit der hinzugefügten Endung "f" oder Endung "l" (Kopf "<complex.h>"),
Der POSIX -Standard wird gelegentlich zusammen mit C verwendet und reserviert alle Namen, die mit "_t" enden.
Universelle Zeichennamen
Ein universeller Zeichenname bezeichnet ein Zeichen nach der Norm ISO/IEC 10646. Bestimmte Buchstaben und Ziffern nach dieser Norm (jedoch nicht die aus dem ASCII -Code-Bereich) können in Bezeichnern ebenfalls verwendet werden, wobei auch hier eine Ziffer nicht am Anfang eines Bezeichners stehen darf. Dabei wird ein Zeichen durch den Quelltext "\u" oder "\U" geschrieben, dem vier bzw. acht Hexadezimalziffern zur hexadezimalen Darstellung der Kennzahl des Zeichens folgen.
Eine Implementation kann auch spezielle Codierungen für solche Zeichen zulassen.
- 〈universal-character-name 〉 ::=
- '\u' 〈hex-quad 〉 |
'\U' 〈hex-quad 〉 〈hex-quad 〉. - 〈hex-quad 〉 ::=
- 〈hexadecimal-digit 〉 〈hexadecimal-digit 〉 〈hexadecimal-digit 〉 〈hexadecimal-digit 〉.
Namen der Standardbibliothek
Die bereits von der Standardbibliothek definierten Namen dürfen nicht umdefiniert werden.
Im folgenden steht "#" für eine Ziffer oder mehrere Ziffern.
Die von der Standardbibliothek definierten Bezeichner sind "BUFSIZ", "CHAR_BIT", "CHAR_MAX", "CHAR_MIN", "CLOCKS_PER_SEC", "CX_LIMITED_RANGE", "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", "DECIMAL_DIG", "EDOM", "EILSEQ", "EOF", "ERANGE", "EXIT_FAILURE", "EXIT_SUCCESS", "FENV_ACCESS", "FE_ALL_EXCEPT", "FE_DFL_ENV", "FE_DIVBYZERO", "FE_DOWNWARD", "FE_INEXACT", "FE_INVALID", "FE_OVERFLOW", "FE_TONEAREST", "FE_TOWARDZERO", "FE_UNDERFLOW", "FE_UPWARD", "FILE", "FILENAME_MAX", "FLT_DIG", "FLT_EPSILON", "FLT_EVAL_METHOD", "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", "FOPEN_MAX", "FP_CONTRACT", "FP_FAST_FMA", "FP_FAST_FMAF", "FP_FAST_FMAL", "FP_ILOGB0", "FP_ILOGBNAN", "FP_INFINITE", "FP_NAN", "FP_NORMAL", "FP_SUBNORMAL", "FP_ZERO", "HUGE_VAL", "HUGE_VALF", "HUGE_VALL", "I", "INFINITY", "INT#_C", "INT#_MAX", "INT#_MIN", "INTMAX#_C", "INTMAX_MAX", "INTMAX_MIN", "INTPTR_MAX", "INTPTR_MIN", "INT_FAST#_MAX", "INT_FAST#_MIN", "INT_LEAST#_MAX", "INT_LEAST#_MIN", "INT_MAX", "INT_MIN", "LC_ALL", "LC_COLLATE", "LC_CTYPE", "LC_MONETARY", "LC_NUMERIC", "LC_TIME", "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", "LLONG_MAX", "LLONG_MIN", "LONG_MAX", "LONG_MIN", "L_tmpnam", "MATH_ERREXCEPT", "MATH_ERRNO", "MB_CUR_MAX", "MB_LEN_MAX", "NAN", "NDEBUG", "NULL", "NULL", "NULL", "NULL", "NULL", "NULL", "NULL", "PRIX#", "PRIXFAST#", "PRIXLEAST#", "PRIXMAX", "PRIXPTR", "PRId#", "PRIdFAST#", "PRIdLEAST#", "PRIdMAX", "PRIdPTR", "PRIi#", "PRIiFAST#", "PRIiLEAST#", "PRIiMAX", "PRIiPTR", "PRIo#", "PRIoFAST#", "PRIoLEAST#", "PRIoMAX", "PRIoPTR", "PRIu#", "PRIuFAST#", "PRIuLEAST#", "PRIuMAX", "PRIuPTR", "PRIx#", "PRIxFAST#", "PRIxLEAST#", "PRIxMAX", "PRIxPTR", "PTRDIFF_MAX", "PTRDIFF_MIN", "RAND_MAX", "SCHAR_MAX", "SCHAR_MIN", "SCNd#", "SCNdFAST#", "SCNdLEAST#", "SCNdMAX", "SCNdPTR", "SCNi#", "SCNiFAST#", "SCNiLEAST#", "SCNiMAX", "SCNiPTR", "SCNo#", "SCNoFAST#", "SCNoLEAST#", "SCNoMAX", "SCNoPTR", "SCNu#", "SCNuFAST#", "SCNuLEAST#", "SCNuMAX", "SCNuPTR", "SCNx#", "SCNxFAST#", "SCNxLEAST#", "SCNxMAX", "SCNxPTR", "SEEK_CUR", "SEEK_END", "SEEK_SET", "SHRT_MAX", "SHRT_MIN", "SIGABRT", "SIGFPE", "SIGILL", "SIGINT", "SIGSEGV", "SIGTERM", "SIG_ATOMIC_MAX", "SIG_ATOMIC_MIN", "SIG_DFL", "SIG_ERR", "SIG_IGN", "SIZE_MAX", "TMP_MAX", "UCHAR_MAX", "UINT#_C", "UINT#_MAX", "UINTMAX#_C", "UINTMAX_MAX", "UINTPTR_MAX", "UINT_FAST#_MAX", "UINT_LEAST#_MAX", "UINT_MAX", "ULLONG_MAX", "ULONG_MAX", "USHRT_MAX", "WCHAR_MAX", "WCHAR_MAX", "WCHAR_MIN", "WCHAR_MIN", "WEOF", "WEOF", "WINT_MAX", "WINT_MIN", "_Complex_I", "_Exit", "_IOFBF", "_IOLBF", "_IONBF", "_Imaginary_I", "_Pragma", "__bool_true_false_are_defined", "abort", "abs", "acos", "acos", "acosf", "acosh", "acosh", "acoshf", "acoshl", "acosl", "and", "and_eq", "asctime", "asin", "asin", "asinf", "asinh", "asinh", "asinhf", "asinhl", "asinl", "assert", "atan", "atan", "atan2", "atan2", "atan2f", "atan2l", "atanf", "atanh", "atanh", "atanhf", "atanhl", "atanl", "atexit", "atof", "atoi", "atol", "atoll", "bitand", "bitor", "bool", "bsearch", "btowc", "cabs", "cabsf", "cabsl", "cacos", "cacosf", "cacosh", "cacoshf", "cacoshl", "cacosl", "calloc", "carg", "carg", "cargf", "cargl", "casin", "casinf", "casinh", "casinhf", "casinhl", "casinl", "catan", "catanf", "catanh", "catanhf", "catanhl", "catanl", "cbrt", "cbrtf", "cbrtl", "ccos", "ccosf", "ccosh", "ccoshf", "ccoshl", "ccosl", "ceil", "ceil", "ceilf", "ceill", "cexp", "cexpf", "cexpl", "cimag", "cimag", "cimagf", "cimagl", "clearerr", "clock", "clock_t", "clog", "clogf", "clogl", "compl", "complex", "conj", "conj", "conjf", "conjl", "copysign", "copysign", "copysignf", "copysignl", "cos", "cos", "cosf", "cosh", "cosh", "coshf", "coshl", "cosl", "cpow", "cpowf", "cpowl", "cproj", "cproj", "cprojf", "cprojl", "creal", "creal", "crealf", "creall", "csin", "csinf", "csinh", "csinhf", "csinhl", "csinl", "csqrt", "csqrtf", "csqrtl", "ctan", "ctanf", "ctanh", "ctanhf", "ctanhl", "ctanl", "ctime", "difftime", "div", "div_t", "double_t", "erf", "erf", "erfc", "erfc", "erfcf", "erfcl", "erff", "erfl", "errno", "exit", "exp", "exp", "exp2", "exp2", "exp2f", "exp2l", "expf", "expl", "expm1", "expm1", "expm1f", "expm1l", "fabs", "fabs", "fabsf", "fabsl", "false", "fclose", "fdim", "fdim", "fdimf", "fdiml", "feclearexept", "fegetenv", "fegetexceptflag", "fegetround", "feholdexcept", "fenv_t", "feof", "feraiseexcept", "ferror", "fesetenv", "fesetexceptflag", "fesetround", "fetestexcept", "feupdateenv", "fexept_t", "fflush", "fgetc", "fgetpos", "fgets", "fgetwc", "fgetws", "float_t", "floor", "floor", "floorf", "floorl", "fma", "fma", "fmaf", "fmal", "fmax", "fmax", "fmaxf", "fmaxl", "fmin", "fmin", "fminf", "fminl", "fmod", "fmod", "fmodf", "fmodl", "fopen", "fpclassify", "fpos_t", "fprintf", "fputc", "fputs", "fputwc", "fputws", "fread", "free", "freopen", "frexp", "frexp", "frexpf", "frexpl", "fscanf", "fseek", "fsetpos", "ftell", "fwide", "fwprintf", "fwrite", "fwscanf", "getc", "getchar", "getenv", "gets", "getwc", "getwchar", "gmtime", "hypot", "hypot", "hypotf", "hypotl", "ilogb", "ilogb", "ilogbf", "ilogbl", "imaginary", "imaxabs", "imaxdiv", "imaxdiv_t", "int#_t", "int_fast#_t", "int_least#_t", "intmax_t", "intptr_t", "isalnum", "isalpha", "isblank", "iscntrl", "isdigit", "isfinite", "isgraph", "isgreater", "isgreaterequal", "isinf", "isless", "islessequal", "islessgreater", "islower", "isnan", "isnormal", "isprint", "ispunct", "isspace", "isunordered", "isupper", "iswalnum", "iswalpha", "iswblank", "iswcntrl", "iswctype", "iswdigit", "iswgraph", "iswlower", "iswprint", "iswpunct", "iswspace", "iswupper", "iswxdigit", "isxdigit", "jmp_buf", "labs", "lconv", "ldexp", "ldexp", "ldexpf", "ldexpl", "ldiv", "ldiv_t", "lgamma", "lgamma", "lgammaf", "lgammal", "llabs", "lldiv", "lldiv_t", "llrint", "llrint", "llrintf", "llrintl", "llround", "llround", "llroundf", "llroundl", "localeconv", "localtime", "log", "log", "log10", "log10", "log10f", "log10l", "log1p", "log1p", "log1pf", "log1pl", "log2", "log2", "log2f", "log2l", "logb", "logb", "logbf", "logbl", "logf", "logl", "longjmp", "lrint", "lrint", "lrintf", "lrintl", "lround", "lround", "lroundf", "lroundl", "malloc", "math_errhandling", "mblen", "mbrlen", "mbrtowc", "mbsinit", "mbsrtowcs", "mbstate_t", "mbstowcs", "mbtowc", "memchr", "memcmp", "memcpy", "memmove", "memset", "mktime", "modf", "modff", "modfl", "nan", "nanf", "nanl", "nearbyint", "nearbyintf", "nearbyintl", "nextafter", "nextafter", "nextafterf", "nextafterl", "nexttoward", "nexttoward", "nexttowardf", "nexttowardl", "not", "not_eq", "offsetof", "or", "or_eq", "perror", "pow", "pow", "powf", "powl", "printf", "ptrdiff_t", "putc", "putchar", "puts", "putwc", "putwchar", "qsort", "raise", "rand", "realloc", "remainder", "remainder", "remainderf", "remainderl", "remove", "remquo", "remquo", "remquof", "remquol", "rename", "rewind", "rint", "rint", "rintf", "rintl", "round", "round", "roundf", "roundl", "scalbln", "scalbln", "scalblnf", "scalblnl", "scalbn", "scalbn", "scalbnf", "scalbnl", "scanf", "setbuf", "setjmp", "setlocale", "setvbuf", "sig_atomic_t", "signal", "sin", "sin", "sinf", "sinh", "sinh", "sinhf", "sinhl", "sinl", "size_t", "size_t", "size_t", "size_t", "size_t", "size_t", "snprintf", "sprintf", "sqrt", "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", "strtof", "strtoimax", "strtok", "strtol", "strtold", "strtoll", "strtoul", "strtoull", "strtoumax", "strxfrm", "swprintf", "swscanf", "system", "tan", "tan", "tanf", "tanh", "tanh", "tanhf", "tanhl", "tanl", "tgamma", "tgamma", "tgammaf", "tgammal", "time", "time_t", "tm", "tm", "tmpfile", "tmpnam", "tolower", "toupper", "towctrans", "towlower", "towupper", "true", "trunc", "trunc", "truncf", "truncl", "uint#_t", "uint_fast#_t", "uint_least#_", "uintmax_t", "uintptr_t", "ungetc", "ungetwc", "va_arg", "va_copy", "va_end", "va_list", "va_start", "vfprintf", "vfscanf", "vfwprintf", "vfwscanf", "vprintf", "vscanf", "vsnprintf", "vsprintf", "vsscanf", "vswprintf", "vswscanf", "vwprintf", "vwscanf", "wchar_t", "wchar_t", "wchar_t", "wcrtomb", "wcscat", "wcschr", "wcscmp", "wcscoll", "wcscpy", "wcscspn", "wcsftime", "wcslen", "wcsncat", "wcsncmp", "wcsncpy", "wcspbrk", "wcsrchr", "wcsrtombs", "wcsspn", "wcsstr", "wcstod", "wcstof", "wcstoimax", "wcstok", "wcstol", "wcstold", "wcstoll", "wcstombs", "wcstoul", "wcstoull", "wcstoumax", "wcsxfrm", "wctob", "wctomb", "wctrans", "wctrans_t", "wctype", "wctype_t", "wint_t", "wint_t", "wmemchr", "wmemcmp", "wmemcpy", "wmemmove", "wmemset", "wprintf", "wscanf", "xor" und "xor_eq".