Dave Whipp wrote:
> Matt Fowles
>> Were this C++ I would say that we could write a single general
>> purpose stack and use template meta-programming to avoid the
>> overhead. Is there a similar solution available in C?
>>
>> My instincts tell me that this solution will be dirty to the tune of
>> massive macroing, but perhaps someone better with pure C than I am
>> could provide a better answer.
>
> C does do templates, sort-of:
>
> #define STACK_TYPE int
> #define STACK_MAX_SIZE 1024
> #include stack_template_decl.h
> #include stack_template_impl.h
> #undef STACK_TYPE
> #undef STACK_MAX_SIZE
>
> (often one instances the stack_decl in a header file, and the _impl in
> a .c file.) I've also seen the calling convention where the template
> files do the #undefs.
>
> There can be some issues debugging this stuff though: gcc will give
> currect line numbers, but will not tell you which instance of the
> stack template you're in. So if a bug is only in, say, stacks of
> double: then this won't be immediately apparent.
Any chance that this could be fixed with a #line pragma, with a filename
which is generated from the parameters? E.g., something like:
#define STRINGIFY(X) ??? /* make a string literal from a token */
#define STACK_TYPE_STR STRINGIFY(STACK_TYPE)
#define STACK_SIZE_STR STRINGIFY(STACK_MAX_SIZE)
#define GENFILENAME \
__LINE__ "[" STACK_TYPE_STR "x" STACK_SIZE_STR "]"
#line 0 GENFILENAME
> On the plus side, the lack of type information means that you don't
> get c++'s 8000-character error messages.
--
$a=24;split//,240513;s/\B/ => /for@@=qw(ac ab bc ba cb ca
);{push(@b,$a),($a-=6)^=1 for 2..$a/6x--$|;print "[EMAIL PROTECTED]
]\n";((6<=($a-=6))?$a+=$_[$a%6]-$a%6:($a=pop @b))&&redo;}