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