- printf calls malloc
- printf calls FPU emulator
- platforms differ over whether %p's output includes a leading 0x
- platforms differ over how you print int64_t/uint64_t
- platforms differ over how you print size_t
- some platforms have almost-ISO-but-not-quite semantics
Additionally, on top of the difficulty of adding extra types in a cross-platform fashion, the printf system is tied to the FILE . FILE s are usually not extensible, and on Windows don't work with sockets.
This is daft, and surprisingly shortsighted (perhaps it's the word "FILE" that causes people to come over all unimaginative?), because you could provide some system like Mac OS X's funopen, and then use fprintf for everything - maybe even replacing snprintf with it! - but functionality like this isn't as widely available as it should be.
Anyway, if you write your own printf, you can fix all of this.