Printf specifiers

One anti-pattern in C is that format-specifiers for printf. These require a lot of effort when creating multi-platform code (ie 32-bit and 64-bit)

Base type specifiers

C2 changes the specifiers to allow only the following types:

  • %c - print character
  • %d - print decimal number
  • %x/%X - print hexadecimal number
  • %o - print octal number
  • %f - print floating-point number
  • %p - print pointer
  • %s - print string
  • %% - print %

The %d specifier is used for all integer numbers (i8, i64, u8, u64, bool, etc). The C2 compiler will automatically use the correct one for the type. Likewise the %f specifier can be used for both f32 and f64.

Never worry about %llu, %ld or %"PRIu64" again!

Other options

Next to that, the printf specifier format still allows all other C options like size and alignment. It supports the full format of:

%[flags][width][.precision][size]type

for example:

printf("%-4s  %06d  %7.3f", text, number, float_number);

Attribute

To allow checking of the format, a function must be marked with the printf_format attribute.