[comp.os.msdos.programmer] ANSI C Paste Operator

so@brownie.cs.wisc.edu (Bryan So) (07/14/90)

I have a tricky way to write generic routines in C, I make use of
the paste operator (##) to paste the target type to the data type 
and operations.  For example, an array of integers can be declared
by
     array(int) a;

and is implemented by
     arrayint a;

The problem is the implementation below only works on Turbo C 2.0
and Turbo C++.  I try it on Microsoft C 5.0 (sorry this is the only
version I have) and BSD UNIX.  It does not compile.  The BSD pre-
processor shows that the line marked with "PROBLEM" is translated to
arrayT instead of arrayint.

Is my method non-standard?  Will Microsoft C 6.0 handle it?

Bryan
__________________________________________________________________________
                                                                 (main.c)
#define T int
#include "array.h"
#undef T

main()
{
     array(int) a;
}
__________________________________________________________________________
                                                                 (array.h)
#if defined(BSD)

#define name2(x,y) _name2(x,y)          /* BSD way to paste            */
#define _name2(x,y) x\
y

#else

#define name2(x,y) _name2(x,y)          /* Need extra redirection, see */
#define _name2(x,y) x##y                /* Turbo C++ include/generic.h */

#endif

#define array(x) name2(array,x)         

typedef struct {
     int size;
     T *vector;                         /* T to be defined in source file */
} array(T);         /* PROBLEM */

/* ... other generic array operations ... */
__________________________________________________________________________