I usually end up doing printf("%j", (intmax_t)foo);
ssize_t is not ISO C. Also, %z is a modifier, not a specifier, so you can print size_t with %zu, or ssize_t with %zd.
(That said, I've only ever used %zu myself... don't think I've ever used ssize_t. I'm pretty sure it's non-ISO.)
I usually end up doing printf("%j", (intmax_t)foo);