Preprocessor keyword #echo is missing

Martin Sebor sebor@roguewave.com
Tue Feb 11 19:43:00 GMT 2003


Zack Weinberg wrote:
> Martin Sebor <sebor@roguewave.com> writes:
> 
> 
>>A #echo at the compiler level rather than at the preprocessor level
>>would, IMHO, be extremely useful in the context of metaprogramming.
>>At the very least, it would provide a framework for the proposed
>>implementation of the static assert feature:
>>
>>http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2002/n1381.htm
> 
> 
> That is an #error analog, not #echo. I do consider it a useful
> feature, but if I were implementing it I'd just take the spec straight
> from N1381 (with appropriate modifications for C) -- don't see the
> need for a static_echo().

Yes, static_assert is equivalent to a #error. I was suggesting
a more ambitious facility, one that would subsume static_assert,
i.e., one that could (but wouldn't be limited to) halt compilation
based on a compile-time predicate, but that could also print
text messages during compilation.

E.g., something along these (half baked) lines

     template <int N>
     struct factorial {
         enum { value = N * factorial<N - 1> };
     };

     template <>
     struct factorial<0> { enum { value = 1 }; };

     template <int N>
     struct print_int {
         #echo "the value is %d", N
     };

     template struct print_int<factorial<7>::value>;

> 
> I wonder why the string literal is included there, when it isn't for
> the runtime assert().

To issue more meaningful and better readable diagnostics
that would be possible otherwise. The libstdc++ concept
checking facility is a good example of how hard to read
the diagnostics can be and how much effort it takes to
make them at least somewhat comprehensible.

Regards
Martin



More information about the Gcc-bugs mailing list