This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: Defining predefined macros for whole translation unit, revisited
Given the general support this time (discussion starting
<http://sourceware.org/ml/libc-alpha/2012-02/msg00009.html>) for
splitting these predefined macros into a header separate from and
included by features.h, this is the specific updated and retested
patch I propose. (I'll make sure the corresponding GCC changes -
already approved in 2009 conditional on the libc changes - do get
updated and checked in for GCC 4.8.)
2012-02-17 Joseph Myers <joseph@codesourcery.com>
[BZ #10110]
* include/stdc-predef.h: New file. Extracted from features.h.
* include/features.h: Include stdc-predef.h.
* Makefile (headers): Add stdc-predef.h.
* CONFORMANCE (Compiler limitations): Update.
diff --git a/CONFORMANCE b/CONFORMANCE
index 8275aba..b23318e 100644
--- a/CONFORMANCE
+++ b/CONFORMANCE
@@ -134,13 +134,12 @@ Compiler limitations
====================
The macros __STDC_IEC_559__, __STDC_IEC_559_COMPLEX__ and
-__STDC_ISO_10646__ are properly supposed to be defined by the
-compiler, and to be constant throughout the translation unit (before
-and after any library headers are included). However, they mainly
-relate to library features, and the necessary magic has yet to be
-implemented for GCC to predefine them to the correct values for the
-library in use, so glibc defines them in <features.h>. Programs that
-test them before including any standard headers may misbehave.
+__STDC_ISO_10646__ are properly supposed to be constant throughout the
+translation unit (before and after any library headers are included).
+However, they mainly relate to library features, and GCC only knows to
+preinclude <stdc-predef.h> to get their definitions in version 4.8 and
+later. Programs that test them before including any standard headers
+may misbehave with older compilers.
GCC doesn't support the optional imaginary types. Nor does it
understand the keyword _Complex before GCC 3.0. This has the
diff --git a/Makefile b/Makefile
index d1fa347..10a2cce 100644
--- a/Makefile
+++ b/Makefile
@@ -60,7 +60,7 @@ endif # $(AUTOCONF) = no
$(addprefix install-, no-libc.a bin lib data headers others)
headers := limits.h values.h features.h gnu-versions.h bits/libc-lock.h \
- bits/xopen_lim.h gnu/libc-version.h
+ bits/xopen_lim.h gnu/libc-version.h stdc-predef.h
echo-headers: subdir_echo-headers
diff --git a/include/features.h b/include/features.h
index 6038ecc..6d094f4 100644
--- a/include/features.h
+++ b/include/features.h
@@ -1,5 +1,4 @@
-/* Copyright (C) 1991-1993,1995-2007,2009,2010,2011
- Free Software Foundation, Inc.
+/* Copyright (C) 1991-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -337,12 +336,7 @@
# define __USE_FORTIFY_LEVEL 0
#endif
-/* We do support the IEC 559 math functionality, real and complex. */
-#define __STDC_IEC_559__ 1
-#define __STDC_IEC_559_COMPLEX__ 1
-
-/* wchar_t uses ISO 10646-1 (2nd ed., published 2000-09-15) / Unicode 3.1. */
-#define __STDC_ISO_10646__ 200009L
+#include <stdc-predef.h>
/* This macro indicates that the installed library is the GNU C Library.
For historic reasons the value now is 6 and this will stay from now
diff --git a/include/stdc-predef.h b/include/stdc-predef.h
new file mode 100644
index 0000000..ef10c16
--- /dev/null
+++ b/include/stdc-predef.h
@@ -0,0 +1,36 @@
+/* Copyright (C) 1991-2012 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#ifndef _STDC_PREDEF_H
+#define _STDC_PREDEF_H 1
+
+/* This header is separate from features.h so that the compiler can
+ include it implicitly at the start of every compilation. It must
+ not itself include <features.h> or any other header that includes
+ <features.h> because the implicit include comes before any feature
+ test macros that may be defined in a source file before it first
+ explicitly includes a system header. GCC knows the name of this
+ header in order to preinclude it. */
+
+/* We do support the IEC 559 math functionality, real and complex. */
+#define __STDC_IEC_559__ 1
+#define __STDC_IEC_559_COMPLEX__ 1
+
+/* wchar_t uses ISO 10646-1 (2nd ed., published 2000-09-15) / Unicode 3.1. */
+#define __STDC_ISO_10646__ 200009L
+
+#endif
--
Joseph S. Myers
joseph@codesourcery.com