What is the purpose of the h and hh modifiers for printf?

One possible reason: for symmetry with the use of those modifiers in the formatted input functions? I know it wouldn’t be strictly necessary, but maybe there was value seen for that?

Although they don’t mention the importance of symmetry for the “h” and “hh” modifiers in the C99 Rationale document, the committee does mention it as a consideration for why the “%p” conversion specifier is supported for fscanf() (even though that wasn’t new for C99 – “%p” support is in C90):

Input pointer conversion with %p was added to C89, although it is obviously risky, for symmetry with fprintf.

In the section on fprintf(), the C99 rationale document does discuss that “hh” was added, but merely refers the reader to the fscanf() section:

The %hh and %ll length modifiers were added in C99 (see ยง7.19.6.2).

I know it’s a tenuous thread, but I’m speculating anyway, so I figured I’d give whatever argument there might be.

Also, for completeness, the “h” modifier was in the original C89 standard – presumably it would be there even if it wasn’t strictly necessary because of widespread existing use, even if there might not have been a technical requirement to use the modifier.

Leave a Comment