[gnu.g++] The Xaw String typdef

thoth@beach.cis.ufl.edu (Gilligan) (02/28/90)

  Amazingly enough, I just ran into this problem yesterday.  The main
problem is that the X toolkit wants to define a String and c++ already
has one.  To avoid name conflicts they have a rather hideous #ifdef
near the top of Intrinxic.h

#if defined(__cplusplus) || defined(c_plusplus)
#define CONST const
/* make const String do the right thing */
#define String		char*
#else
#define CONST
#endif /* __cplusplus */

  This makes every occurrence of String be replaced by char*, including

#define XtNumber(arr)		((Cardinal) (sizeof(arr) / sizeof(arr[0])))

typedef char *String;		// right here
typedef struct _WidgetRec *Widget;
typedef Widget *WidgetList;

  the String in the typedef.  If you ran your program through the
preprocessor you would discover that it was turning into

typedef char *char*;

--
  My solution

  I just put these lines in my Makefile and used #include "X11/Intrinsic.h".

X11/%.h	: /usr/include/X11/%.h
	sed 's/\([^a-zA-Z"]\)String/\1XtString/g' < /usr/include/$@ | sed '/define XtString/ d' > $@
X11/Xaw/%.h	: /usr/include/X11/Xaw/%.h
	sed 's/\([^a-zA-Z"]\)String/\1XtString/g' < /usr/include/$@ > $@


***************************  Warning! ***************************

 this requires you to now put every included X file in your dependency
list for the .o files and create subdirectories X11 and X11/Xaw in
your make directory.
  The sed scripts basically replace every ocurrence of String that
needs replacing with XtString.  There are quite a few instances where
this would be VERY BAD! and thus the regex from hell.
  It is a nasty hack and the proper solution is to have everyone
change to XtString (like my sedded header files:) instead of String.
Another hack which would preclude use of the c++ String class, but fix
the X include so it is sort of rational, is to put

#ifndef String 
typedef char *String; 
#endif /*String*/
typedef struct _WidgetRec *Widget;

  around the lines in Intrinsic.h

  This is my rather nasty hack, but it has worked fine (i did run into
problems at the start but that's what the \([a-zA-Z"]\) is for).

  If anyone has a better/cleaner/more obscure hack that would impress
the heck out of me, POST it.  I don't like my solution and would
welcome a "better" one.

  To X hackers in particular, I have been having trouble using an
app-defaults file.  I can't figure out the application name I should
prepend to resources to get it to work properly (yes, this belongs in
comp.windows.X but I can't read its volume, period).

  THOTH out -=O=-
--
( My name's not really Gilligan, It's Robert Forsman, without an `e' )