[RFC]: c99 compiled world

Dag-Erling Smørgrav des at des.no
Mon Nov 10 08:42:40 PST 2008


Here's how it *should* work in userland:

1) The compiler defines __STDC__ to 1.

2) The compiler defines __STDC_HOSTED__ to 1.

3) The compiler defines __STDC_VERSION__ according to the requested
   language version:

   iso9899:1990, c89, gnu89: not defined (equivalent to 0)
   iso9899:199409: 199409L
   iso9899:1999, c99, gnu99: 199901L

   The default language version for gcc is gnu89.

4) The compiler defines __STRICT_ANSI__ to 1 if the requested language
   version was iso9899:1990, c89, iso9899:199409, iso9899:1999 or c99.
   Otherwise, __STRICT_ANSI__ is not defined.

5) Any macro, type, variable or function defined by the C standard
   should be visible if and only if __STDC_VERSION__ is greater than or
   equal to the value that corresponds to the version of the standard
   where that macro, type, variable or function was introduced.

6) The application defines _POSIX_SOURCE or _POSIX_C_SOURCE to indicate
   that it uses macros, types, variables or functions defined in a
   specific version of the IEEE 1003 (POSIX) standard.  Note that
   _POSIX_C_SOURCE overrides _POSIX_SOURCE.  Defining _POSIX_SOURCE to
   any value is equivalent to defining _POSIX_C_SOURCE to 1.  Currently
   defined values of _POSIX_C_SOURCE are:

   IEEE 1003.1-1990: 1
   IEEE 1003.1b-1993: 199309L
   IEEE 1003.1c-1995: 199506L
   IEEE 1003.1-2004: 200112L

   Any macro, type, variable or function defined by IEEE 1003 should be
   visible if and only if _POSIX_C_SOURCE is greater than or equal to
   the value that corresponds to the version of the standard where that
   macro, type, variable or function was introduced.

7) The application defines _XOPEN_SOURCE to indicate that it uses
   macros, types, variables or functions defined in a specific version
   of the X/Open Single Unix Specification.  Note that the SUS was a
   superset of POSIX, until the SUSv3, which is equivalent to IEEE
   1003.1-2001.  Currently defined values of _XOPEN_SOURCE are:

   XPG3: 3
   XPG4 / SUS: 4
   SUS2: 500
   SUS3: 600

   Any macro, type, variable or function defined by the SUS should be
   visible if and only if _XOPEN_SOURCE is greater than or equal to the
   value that corresponds to the version of the standard where that
   macro, type, variable or function was introduced.

8) Anything *not* defined in any of the above standard should be placed
   in separate header files, or made visible only if the application
   defines a specific macro.  For instance, in glibc, getopt_long() is
   visible if and only if the application defined _GNU_SOURCE, and
   gethostname() is visible if and only if the application defined
   _BSD_SOURCE.

9) The default behavior (if the compiler does not define __STRICT_ANSI__
   and the application does not define any of the _FOO_SOURCE macros)
   should be to act as if the application had defined all the
   _FOO_SOURCE macros to the highest value possible, i.e. make
   everything visible.

DES
-- 
Dag-Erling Smørgrav - des at des.no


More information about the freebsd-current mailing list