[PATCH v2:x11proto] Fix Xfuncproto.h to work when #included in a C89-mode compilation

Alan Coopersmith alan.coopersmith at oracle.com
Mon Aug 29 23:09:49 PDT 2011


Variable argument macros are not supported in C89, only C99 or a
compiler-specific extension like gcc's.   Even just defining the
macro causes builds with C89 compilers to fail, as they can't
figure out how to handle #define _X_NONNULL(...), so only define
the fallback for C99 compilers.

Since this means C89 compilers will see _X_NONNULL unexpanded in
sources, add a comment to remind users that this should only be
used with #ifdef _X_NONNULL guards in public/exported API headers
we install for other software to compile against, so that we don't
break their builds.

Signed-off-by: Alan Coopersmith <alan.coopersmith at oracle.com>
---

Updated commit comment and header comment from "never in public headers"
to "okay in public headers, but only inside an #ifdef guard".

 Xfuncproto.h.in |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/Xfuncproto.h.in b/Xfuncproto.h.in
index 0d7b8b7..dc913fa 100644
--- a/Xfuncproto.h.in
+++ b/Xfuncproto.h.in
@@ -128,10 +128,12 @@ in this Software without prior written authorization from The Open Group.
 # define _X_ATTRIBUTE_PRINTF(x,y)
 #endif
 
-/* requires xproto >= 7.0.22 */
+/* requires xproto >= 7.0.22 - since this uses either gcc or C99 variable
+   argument macros, must be only used inside #ifdef _X_NONNULL guards, as
+   many legacy X clients are compiled in C89 mode still. */
 #if defined(__GNUC__) &&  ((__GNUC__ * 100 + __GNUC_MINOR__) >= 303)
 #define _X_NONNULL(args...)  __attribute__((nonnull(args)))
-#else
+#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ - 0 >= 199901L) /* C99 */
 #define _X_NONNULL(...)  /* */
 #endif
 
-- 
1.7.3.2



More information about the xorg-devel mailing list