Identifiers NOT to define in your programs (revised version) 
Author Message
 Identifiers NOT to define in your programs (revised version)

(followups to comp.std.c)

If you want to write a portable C program, you have to be careful not to
give your own definitions to any of the identifiers that are reserved by
the C standard.  The standard tells you which identifiers are reserved,
but scatters the information through a rather thick book.

The basic principles of reserved identifiers are in sections 4.1.2.1 and
3.1.2.3 of the standard.  There it warns you that "if a program declares
or defines an identifier with the same name as an identifier reserved in
that context ..., the behavior is undefined."  That means that the
compiler is fully justified in turning your terminal into a large wart
hog.  (Secs 1.6 and 4.1.2.1 of the standard allow such behavior, though
market forces might not support it.)  More realistically, your program
may or may not work right, and you may or may not get a diagnostic
message; see sec 1.6 of the standard.

The "context" mentioned in the rule is a bit tricky.  If you're writing
programs in C, you can safely ignore the complications by following this
simple rule:  if an identifier is shown in the list below, never declare
it in your own program.  If you're implementing a C compiler, you do
need to worry about the complications of which identifiers are reserved
in what contexts, and this list won't give you the whole story.

Here's an explanation of the columns of the table:

   1. identifier:  the reserved identifier.  Some entries are shown as
      pseudo-regular expressions; for example, LC_[A-Z][any] means any
      identifier that begins with capital LC, an underscore, and another
      capital letter.  The sort order is underscore first, digits next,
      letters (mixed caps and lower case) last.

      An asterisk (*) precedes each identifier that is reserved for use
      with external linkage:  your program must never declare it as a
      non-static function or global variable, whether or not your
      program uses the indicated header file.  Predefined identifiers
      and keywords are marked with # and are always reserved.

      Other identifiers are reserved only in modules that include the
      indicated header files.  However, if you use such an identifier
      and someone later modifies your program by including that header
      for some other purpose, it would be a {*filter*} "gotcha".

    - header:  the header file or other mechanism that declares or
      defines the reserved identifier.  "predef" marks a predefined
      identifier for use on preprocessor lines; "keyword" means one of
      the languages's few keywords.

    - ANSI sec:  the section of the standard that most clearly reserves
      or describes the identifier.

 identifier         header    ANSI sec

  _[any]                      4.1.2.1
# __DATE__          (predef)  3.8.8
# __FILE__          (predef)  3.8.8
# __LINE__          (predef)  3.8.8
# __STDC__          (predef)  3.8.8
# __TIME__          (predef)  3.8.8
  _IOFBF            stdio.h   4.9.1
  _IOLBF            stdio.h   4.9.1
  _IONBF            stdio.h   4.9.1

* abort             stdlib.h  4.10.4.1
* abs               stdlib.h  4.10.6.1
* acos              math.h    4.5.2.1
* acosf, acosl      math.h    4.13.4
* asctime           time.h    4.12.3.1
* asin              math.h    4.5.2.2
* asinf, asinl      math.h    4.13.4
  assert            assert.h  4.2
* atan              math.h    4.5.2.3
* atan2             math.h    4.5.2.4
* atan2f, atan2l    math.h    4.13.4
* atanf, atanl      math.h    4.13.4
* atexit            stdlib.h  4.10.4.2
* atof              stdlib.h  4.10.1.1
* atoi              stdlib.h  4.10.1.2
* atol              stdlib.h  4.10.1.3
# auto              (keyword) 3.1.1

# break             (keyword) 3.1.1
* bsearch           stdlib.h  4.10.5.1
  BUFSIZ            stdio.h   4.9.1

* calloc            stdlib.h  4.10.3.1
# case              (keyword) 3.1.1
* ceil              math.h    4.5.6.1
* ceilf, ceill      math.h    4.13.4
# char              (keyword) 3.1.1
  CHAR_BIT          limits.h  2.2.4.2.1
  CHAR_MAX          limits.h  2.2.4.2.1
  CHAR_MIN          limits.h  2.2.4.2.1
* clearerr          stdio.h   4.9.10.1
* clock             time.h    4.12.2.1
  clock_t           time.h    4.12.1
  CLOCKS_PER_SEC    time.h    4.12.1
# const             (keyword) 3.1.1
# continue          (keyword) 3.1.1
* cos               math.h    4.5.2.5
* cosf              math.h    4.13.4
* cosh              math.h    4.5.3.1
* coshf, coshl      math.h    4.13.4
* cosl              math.h    4.13.4
* ctime             time.h    4.12.3.2
  currency_symbol   locale.h  4.4

  DBL_DIG           float.h   2.2.4.2.2
  DBL_EPSILON       float.h   2.2.4.2.2
  DBL_MANT_DIG      float.h   2.2.4.2.2
  DBL_MAX           float.h   2.2.4.2.2
  DBL_MAX_10_EXP    float.h   2.2.4.2.2
  DBL_MAX_EXP       float.h   2.2.4.2.2
  DBL_MIN           float.h   2.2.4.2.2
  DBL_MIN_10_EXP    float.h   2.2.4.2.2
  DBL_MIN_EXP       float.h   2.2.4.2.2
  decimal_point     locale.h  4.4
# default           (keyword) 3.1.1
# defined           (predef)  3.8.8
* difftime          time.h    4.12.2.2
* div               stdlib.h  4.10.6.2
  div_t             stdlib.h  4.10
# do                (keyword) 3.1.1
# double            (keyword) 3.1.1

  E[0-9A-Z][any]    errno.h   4.13.1
  EDOM              errno.h   4.1.3
# else              (keyword) 3.1.1
# enum              (keyword) 3.1.1
  EOF               stdio.h   4.9.1
  ERANGE            errno.h   4.1.3
* errno             errno.h   4.1.3
* exit              stdlib.h  4.10.4.3
  EXIT_FAILURE      stdlib.h  4.10
  EXIT_SUCCESS      stdlib.h  4.10
* exp               math.h    4.5.4.1
* expf, expl        math.h    4.13.4
# extern            (keyword) 3.1.1

* fabs              math.h    4.5.6.2
* fabsf, fabsl      math.h    4.13.4
* fclose            stdio.h   4.9.5.1
* feof              stdio.h   4.9.10.2
* ferror            stdio.h   4.9.10.3
* fflush            stdio.h   4.9.5.2
* fgetc             stdio.h   4.9.7.1
* fgetpos           stdio.h   4.9.9.1
* fgets             stdio.h   4.9.7.2
  FILE              stdio.h   4.9.1
  FILENAME_MAX      stdio.h   4.9.1
# float             (keyword) 3.1.1
* floor             math.h    4.5.6.3
* floorf, floorl    math.h    4.13.4
  FLT_DIG           float.h   2.2.4.2.2
  FLT_EPSILON       float.h   2.2.4.2.2
  FLT_MANT_DIG      float.h   2.2.4.2.2
  FLT_MAX           float.h   2.2.4.2.2
  FLT_MAX_10_EXP    float.h   2.2.4.2.2
  FLT_MAX_EXP       float.h   2.2.4.2.2
  FLT_MIN           float.h   2.2.4.2.2
  FLT_MIN_10_EXP    float.h   2.2.4.2.2
  FLT_MIN_EXP       float.h   2.2.4.2.2
  FLT_RADIX         float.h   2.2.4.2.2
  FLT_ROUNDS        float.h   2.2.4.2.2
* fmod              math.h    4.5.6.4
* fmodf, fmodl      math.h    4.13.4
* fopen             stdio.h   4.9.5.3
  FOPEN_MAX         stdio.h   4.9.1
# for               (keyword) 3.1.1
  fpos_t            stdio.h   4.9.1
* fprintf           stdio.h   4.9.6.1
* fputc             stdio.h   4.9.7.3
* fputs             stdio.h   4.9.7.4
  frac_digits       locale.h  4.4
* fread             stdio.h   4.9.8.1
* free              stdlib.h  4.10.3.2
* freopen           stdio.h   4.9.5.4
* frexp             math.h    4.5.4.2
* frexpf, frexpl    math.h    4.13.4
* fscanf            stdio.h   4.9.6.2
* fseek             stdio.h   4.9.9.2
* fsetpos           stdio.h   4.9.9.3
* ftell             stdio.h   4.9.9.4
* fwrite            stdio.h   4.9.8.2

* getc              stdio.h   4.9.7.5
* getchar           stdio.h   4.9.7.6
* getenv            stdlib.h  4.10.4.4
* gets              stdio.h   4.9.7.7
* gmtime            time.h    4.12.3.3
# goto              (keyword) 3.1.1
  grouping          locale.h  4.4

  HUGE_VAL          math.h    4.5

# if                (keyword) 3.1.1
# int               (keyword) 3.1.1
  int_curr_symbol   locale.h  4.4
  int_frac_digits   locale.h  4.4
  INT_MAX           limits.h  2.2.4.2.1
  INT_MIN           limits.h  2.2.4.2.1
* is[a-z][any]      ctype.h   4.13.2
* isalnum           ctype.h   4.3.1.1
* isalpha           ctype.h   4.3.1.2
* iscntrl           ctype.h   4.3.1.3
* isdigit           ctype.h   4.3.1.4
* isgraph           ctype.h   4.3.1.5
* islower           ctype.h   4.3.1.6
* isprint           ctype.h   4.3.1.7
* ispunct           ctype.h   4.3.1.8
* isspace           ctype.h   4.3.1.9
* isupper           ctype.h   4.3.1.10
* isxdigit          ctype.h   4.3.1.11

  jmp_buf           setjmp.h  4.6

  L_tmpnam          stdio.h   4.9.1
* labs              stdlib.h  4.10.6.3
  LC_[A-Z][any]     locale.h  4.13.3
  LC_ALL            locale.h  4.4
  LC_COLLATE        locale.h  4.4
  LC_CTYPE          locale.h  4.4
  LC_MONETARY       locale.h  4.4
  LC_NUMERIC        locale.h  4.4
  LC_TIME           locale.h  4.4
  lconv (struct)    locale.h  4.4
  LDBL_DIG          float.h   2.2.4.2.2
  LDBL_EPSILON      float.h   2.2.4.2.2
  LDBL_MANT_DIG     float.h   2.2.4.2.2
  LDBL_MAX          float.h   2.2.4.2.2
  LDBL_MAX_10_EXP   float.h   2.2.4.2.2
  LDBL_MAX_EXP      float.h   2.2.4.2.2
  LDBL_MIN          float.h   2.2.4.2.2
  LDBL_MIN_10_EXP   float.h   2.2.4.2.2
  LDBL_MIN_EXP      float.h   2.2.4.2.2
* ldexp             math.h    4.5.4.3
* ldexpf, ldexpl    math.h    4.13.4
* ldiv              stdlib.h  4.10.6.4
  ldiv_t            stdlib.h  4.10
* localeconv        locale.h  4.4.2.1
* localtime         time.h    4.12.3.4
* log               math.h    4.5.4.4
* log10             math.h    4.5.4.5
* log10f, log10l    math.h    4.13.4
* logf, logl        math.h    4.13.4
# long              (keyword) 3.1.1
  LONG_MAX          limits.h  2.2.4.2.1
  LONG_MIN          limits.h  2.2.4.2.1
* longjump          setjmp.h  4.6.1.1

* malloc            stdlib.h  4.10.3.3
  MB_CUR_MAX        stdlib.h  4.10
  MB_LEN_MAX        limits.h  2.2.4.2.1
* mblen             stdlib.h  4.10.7.1
* mbstowcs          stdlib.h  4.10.8.1
* mbtowc            stdlib.h  4.10.7.2
* mem[a-z][any]     string.h  4.13.8
* memchr            string.h  4.11.5.1
* memcmp            string.h  4.11.4.1
* memcpy            string.h  4.11.2.1
* memmove           string.h  4.11.2.2
* memset            string.h  4.11.6.1
* mktime            time.h    4.12.2.3
* modf              math.h    4.5.4.6
* modff, modfl      math.h    4.13.4
  mon_decimal_point locale.h  4.4
  mon_grouping      locale.h  4.4
  mon_thousands_sep locale.h  4.4

  n_cs_precedes     locale.h  4.4
  n_sep_by_space    locale.h  4.4
  n_sign_posn       locale.h  4.4
  NDEBUG            assert.h  4.2
  negative_sign     locale.h  4.4
  NULL              many      many

  offsetof          stddef.h  4.1.5

  p_cs_precedes     locale.h  4.4
  p_sep_by_space    locale.h  4.4
  p_sign_posn       locale.h  4.4
* perror            stdio.h   4.9.10.4
  positive_sign     locale.h  4.4
* pow               math.h    4.5.5.1
* powf, powl        math.h    4.13.4
* printf            stdio.h   4.9.6.3
  ptrdiff_t         stddef.h  4.1.5
* putc              stdio.h   4.9.7.8
* putchar           stdio.h   4.9.7.9
* puts              stdio.h   4.9.7.10

* qsort             stdlib.h  4.10.5.2

* raise             signal.h  4.7.2.1
* rand              stdlib.h  4.10.2.1
  RAND_MAX          stdlib.h  4.10
* realloc           stdlib.h  4.10.3.4
# register          (keyword) 3.1.1
* remove            stdio.h   4.9.4.1
* rename            stdio.h   4.9.4.2
# return            (keyword) 3.1.1
* rewind            stdio.h   4.9.9.5

* scanf             stdio.h   4.9.6.4
  SCHAR_MAX         limits.h  2.2.4.2.1
  SCHAR_MIN         limits.h  2.2.4.2.1
  SEEK_CUR          stdio.h   4.9.1
  SEEK_END          stdio.h   4.9.1
  SEEK_SET          stdio.h   4.9.1
* setbuf            stdio.h   4.9.5.5
* setjmp            setjmp.h  4.6.1.1
* setlocale         locale.h  4.4.1.1
* setvbuf           stdio.h   4.9.5.6
# short             (keyword) 3.1.1
  SHRT_MAX          limits.h  2.2.4.2.1
  SHRT_MIN          limits.h  2.2.4.2.1
  SIG_[A-Z][any]    signal.h  4.7
  sig_atomic_t      signal.h  4.7
  SIG_DFL           signal.h  4.7
  SIG_ERR           signal.h  4.7
  SIG_IGN           signal.h  4.7
  SIG[A-Z][any]     signal.h  4.7
  SIGABRT           signal.h  4.7
  SIGFPE            signal.h  4.7
  SIGILL            signal.h  4.7
  SIGINT            signal.h  4.7
* signal            signal.h  4.7.1.1
# signed            (keyword) 3.1.1
  SIGSEGV           signal.h  4.7
  SIGTERM           signal.h  4.7
* sin               math.h    4.5.2.6
* sinf              math.h    4.13.4
* sinh              math.h    4.5.3.2
* sinhf, sinhl      math.h    4.13.4
* sinl              math.h    4.13.4
# sizeof            (keyword) 3.1.1
* size_t            many      many
* sprintf           stdio.h   4.9.6.5
* sqrt              math.h    4.5.5.2
* sqrtf, sqrtl      math.h    4.13.4
* srand             stdlib.h  4.10.2.1
* sscanf            stdio.h   4.9.6.6
# static            (keyword) 3.1.1
  stderr            stdio.h   4.9.1
  stdin             stdio.h   4.9.1
  stdout            stdio.h   4.9.1
* str[a-z][any]     stdlib.h  4.13.7
* str[a-z][any]     string.h  4.13.8
* strcat            string.h  4.11.3.1
* strchr            string.h  4.11.5.2
* strcmp            string.h  4.11.4.2
* strcoll           string.h  4.11.4.3
* strcpy            string.h  4.11.2.3
* strcspn           string.h  4.11.5.3
* strerror          string.h  4.11.6.2
* strftime          time.h    4.12.3.5
* strlen            string.h  4.11.6.3
* strncat           string.h  4.11.3.2
* strncmp           string.h  4.11.4.4
* strncpy           string.h  4.11.2.4
* strpbrk           string.h  4.11.5.4
* strrchr           string.h  4.11.5.5
* strspn            string.h  4.11.5.6
* strstr            string.h  4.11.5.7
* strtod            stdlib.h  4.10.1.4
* strtok            string.h  4.11.5.8
* strtol            stdlib.h  4.10.1.5
* strtoul           stdlib.h  4.10.1.6
# struct            (keyword) 3.1.1
* strxfrm           string.h  4.11.4.5
# switch            (keyword) 3.1.1
* system            stdlib.h  4.10.4.5

* tan               math.h    4.5.2.7
* tanf              math.h    4.13.4
* tanh              math.h    4.5.3.3
* tanhf, tanhl      math.h    4.13.4
* tanl              math.h    4.13.4
  thousands_sep     locale.h  4.4
* time              time.h    4.12.2.4
  time_t            time.h    4.12.1
  tm (struct)       time.h    4.12.1
  tm_hour           time.h    4.12.1
  tm_isdst          time.h    4.12.1
  tm_mday           time.h    4.12.1
  tm_min            time.h    4.12.1
  tm_mon            time.h    4.12.1
  tm_sec            time.h    4.12.1
  tm_wday           time.h    4.12.1
  tm_yday           time.h    4.12.1
  tm_year           time.h    4.12.1
  TMP_MAX           stdio.h   4.9.1
* tmpfile           stdio.h   4.9.4.3
* tmpnam            stdio.h   4.9.4.4
* to[a-z][any]      ctype.h   4.13.2
* tolower           ctype.h   4.3.2.1
* toupper           ctype.h   4.3.2.2
# typedef           (keyword) 3.1.1

  UCHAR_MAX         limits.h  2.2.4.2.1
  UINT_MAX          limits.h  2.2.4.2.1
  ULONG_MAX         limits.h  2.2.4.2.1
* ungetc            stdio.h   4.9.7.11
# union             (keyword) 3.1.1
# unsigned          (keyword) 3.1.1
  USHRT_MAX         limits.h  2.2.4.2.1

  va_arg            stdarg.h  4.8.1
* va_end            stdarg.h  4.8.1
  va_list           stdarg.h  4.8
  va_start          stdarg.h  4.8.1
* vfprintf          stdio.h   4.9.6.7
# void              (keyword) 3.1.1
# volatile          (keyword) 3.1.1
* vprintf           stdio.h   4.9.6.8
* vsprintf          stdio.h   4.9.6.9

  wchar_t           stddef.h  4.1.5
  wchar_t           stdlib.h  4.10
* wcs[a-z][any]     string.h  4.13.8
* wcstombs          stdlib.h  4.10.8.2
* wctomb            stdlib.h  4.10.7.3
# while             (keyword) 3.1.1

 * = reserved for any use with external linkage
 # = always reserved

One final word on choice of identifiers:  make sure they're unique in
the first 31 characters for internal names, or 6 characters (upper and
lower case not significant) for external names.  Section 3.1.2 says that
conforming implementations can consider, for example, external names
ABCDEFG and abcdefh to identify the same object or function.

My thanks to Steve Summit and Bruce Evans for suggesting improvements in
this list.  Of course, I bear responsibility for any errors; please

         Copyright (C) 1992  Oak Road Systems  +1 216 371-0043

original version: 1992 Jan 22
        revision: 1992 Feb 4  Correct some "float.h" to "limits.h".
        revision: 1992 Mar 7  Clarify and rewrite explanatory text;
                              add struct tags and member names;
                              rearrange columns and add # markers.
--

Only one word in the language ends in S-E-D-E: supersede.  Three others
end in C-E-E-D: exceed, proceed, succeed.  All others end in C-E-D-E:
accede, antecede, cede, concede, precede, recede, secede, ...



Fri, 26 Aug 1994 01:37:09 GMT  
 
 [ 1 post ] 

 Relevant Pages 

1. Program in debug version works but not in release version

2. identifiers not to use in C programs

3. Identifiers NOT to use in your C program

4. DDX_DateTimeCtrl not defined in debug-version of MFC library

5. Socket programming: Using IP_ADD_MEMBERSHIP is not defined???

6. Preliminary Program for USENIX C++ Workshop (revised 10/13)

7. Preliminary program for USENIX C++ Workshop (revised 10/3)

8. Why the Font size is not same between Debug version and Release Version

9. Debug version works, Release version does not?!

10. Why the Font size is not same between Debug version and Release Version

11. Debug version program works fine but its release version causes a GP error

12. SCCS Identifier in C++ program, g++ -Wall warning

 

 
Powered by phpBB® Forum Software