Plataforma independiente size_t Formatos de formato en c?

Quiero imprimir una variable de tipo size_t en C, pero parece que size_t tiene un alias para diferentes tipos de variables en diferentes architectures. Por ejemplo, en una máquina (64 bits) el siguiente código no arroja ninguna advertencia:

 size_t size = 1; printf("the size is %ld", size); 

pero en mi otra máquina (32 bits) el código anterior produce el siguiente mensaje de advertencia:

advertencia: el formato ‘% ld’ espera el tipo ‘long int *’, pero el argumento 3 tiene el tipo ‘size_t *’

Sospecho que esto se debe a la diferencia en el tamaño del puntero, por lo que en mi máquina de 64 bits size_t tiene un alias de long int ( "%ld" ), mientras que en mi máquina de 32 bits size_t tiene un alias de otro tipo.

¿Hay un especificador de formato específicamente para size_t ?

    Sí: use el modificador de longitud z :

     size_t size = sizeof(char); printf("the size is %zd\n", size); // decimal size_t printf("the size is %zx\n", size); // hex size_t 

    Los otros modificadores de longitud que están disponibles son hh (para char ), h (para short ), l (para long ), ll (para long long ), j (para intmax_t ), t (para ptrdiff_t ) y L (para long double ). Ver §7.19.6.1 (7) del estándar C99.

    Sí hay. Es %zu (como se especifica en ANSI C99).

     size_t size = 1; printf("the size is %zu", size); 

    Tenga en cuenta que size_t no está firmado, por lo que %ld es doble incorrecto: modificador de longitud incorrecta y especificador de conversión de formato incorrecto. En caso de que se pregunte, %zd es para ssize_t (que está firmado).

    MSDN , dice que Visual Studio admite el prefijo “I” para código portátil en plataformas de 32 y 64 bits.

     size_t size = 10; printf("size is %Iu", size);