cprintfconversion-specifierlength-modifiers

What is the difference between the %PRId and %d format characters?


Consider the following code:

#include <stdio.h>
#include <inttypes.h>

void main(void)
{
    int32_t a = 44;

    fprintf(stdout, "%d\n", a);
    fprintf(stdout, "%"PRId32"\n", a);
}

When is it better to use %d and when would it be better to use "%"PRId32? How do both of those format characters differ? Does this have something to do with how int32_t is typedeffed on your hardware/machine?


Solution

  • Use %d for int and PRId32 for int32_t.

    Maybe on your platform int32_t is just a typedef for int but this is not true in general. Using a wrong specifier invokes undefined behavior and should be avoided.

    As pointed out by @EricPostpischil note that %d is used inside a quoted format string while PRId32 is used outside. The reason for this is that PRId32 is a macro which expands to a string literal and is then concatenated.