Compared to the old implementation:
- In C++, we only recurse into aggregate classes.
- Unnamed bit-fields are not printed.
- Constant evaluation is supported.
- Proper conversion is done when passing arguments through ....
- Additional arguments are supported and are injected prior to the format string; this directly supports use with fprintf, for example.
- An arbitrary callable can be passed rather than only a function pointer. In particular, in C++, a function template or overload set is acceptable.
- All text generated by Clang is printed via %s rather than directly; this avoids issues where Clang's pretty-printing output might itself contain a % character.
- Fields of types that we don't know how to print are printed with a "*%p" format and passed by address to the print function.
- No return value is produced.
For post-commit: perhaps the string quoting and limit should be documented?