changeset 5424:70defb094eb7

[defined __GETOPT_PREFIX && !defined __need_getopt]: Include <unistd.h> if available. Then rename getopt to __GETOPT_PREFIX##getopt, and so forth for the other external symbols. (getopt) [!defined __GNU_LIBRARY]: Use prototype, not old-style declaration, since the above renaming now works around collisions.
author Paul Eggert <eggert@cs.ucla.edu>
date Thu, 11 Nov 2004 20:24:58 +0000
parents a317f6d7d38b
children 354b1085b8bd
files lib/getopt_.h
diffstat 1 files changed, 28 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/lib/getopt_.h
+++ b/lib/getopt_.h
@@ -23,6 +23,34 @@
 # define _GETOPT_H 1
 #endif
 
+/* Standalone applications should #define __GETOPT_PREFIX to an
+   identifier that prefixes the external functions and variables
+   defined in this header.  When this happens, include <unistd.h> (the
+   standard header declaring getopt), so that it will not cause
+   confusion if it is included later.  Then systematically rename
+   identifiers so that they do not collide with the system functions
+   and variables.  Renaming avoids problems with some compilers and
+   linkers.  */
+#if defined __GETOPT_PREFIX && !defined __need_getopt
+# if HAVE_UNISTD_H
+#  include <unistd.h>
+# endif
+# undef getopt
+# undef getopt_long
+# undef getopt_long_only
+# undef optarg
+# undef opterr
+# undef optind
+# undef optopt
+# define getopt __GETOPT_PREFIX##getopt
+# define getopt_long __GETOPT_PREFIX##getopt_long
+# define getopt_long_only __GETOPT_PREFIX##getopt_long_only
+# define optarg __GETOPT_PREFIX##optarg
+# define opterr __GETOPT_PREFIX##opterr
+# define optind __GETOPT_PREFIX##optind
+# define optopt __GETOPT_PREFIX##optopt
+#endif
+
 /* If __GNU_LIBRARY__ is not already defined, either we are being used
    standalone, or this is the first header included in the source file.
    If we are being used with glibc, we need to include <features.h>, but
@@ -144,15 +172,8 @@
    arguments to the option '\0'.  This behavior is specific to the GNU
    `getopt'.  */
 
-#ifdef __GNU_LIBRARY__
-/* Many other libraries have conflicting prototypes for getopt, with
-   differences in the consts, in stdlib.h.  To avoid compilation
-   errors, only prototype getopt for the GNU C library.  */
 extern int getopt (int ___argc, char *const *___argv, const char *__shortopts)
        __THROW;
-#else /* not __GNU_LIBRARY__ */
-extern int getopt ();
-#endif /* __GNU_LIBRARY__ */
 
 #ifndef __need_getopt
 extern int getopt_long (int ___argc, char *const *___argv,