Como dijo AraK, la interfaz de transmisión de c ++ siempre funcionará de forma portátil.
std :: size_t s = 1024; std :: cout << s; // o cualquier otro tipo de flujo como stringstream!
Si desea C stdio, no hay una respuesta portátil a esto para ciertos casos de "portátil". Y se pone feo ya que, como has visto, elegir los indicadores de formato incorrectos puede generar una advertencia del compilador o dar una salida incorrecta.
C99 intentó resolver este problema con formatos inttypes.h como "%" PRIdMAX "\ n". Pero al igual que con "% zu", no todos admiten c99 (como MSVS antes de 2013). Hay archivos "msinttypes.h" flotando para lidiar con esto.
Si realiza una conversión a un tipo diferente, dependiendo de los indicadores, puede recibir una advertencia del compilador para el truncamiento o un cambio de signo. Si sigue esta ruta, elija un tipo de tamaño fijo relevante más grande. Uno sin signo largo largo y "% llu" o sin signo largo "% lu" debería funcionar, pero llu también puede ralentizar las cosas en un mundo de 32 bits como demasiado grande. (Editar: mi mac emite una advertencia en 64 bits para que% llu no coincida con size_t, aunque% lu,% llu y size_t son todos del mismo tamaño. Y% lu y% llu no son del mismo tamaño en mi MSVS2012. Entonces es posible que deba emitir + usar un formato que coincida).
Para el caso, puede ir con tipos de tamaño fijo, como int64_t. ¡Pero espera! Ahora volvemos a c99 / c ++ 11, y MSVS anterior falla nuevamente. ¡Además, también tiene moldes (por ejemplo, map.size () no es un tipo de tamaño fijo)!
Puede usar un encabezado o biblioteca de terceros, como boost. Si aún no está usando uno, es posible que no quiera inflar su proyecto de esa manera. Si está dispuesto a agregar uno solo para este problema, ¿por qué no usar transmisiones de c ++ o compilación condicional?
Por lo tanto, tiene que recurrir a transmisiones en c ++, compilación condicional, marcos de trabajo de terceros o algo portátil que funcione para usted.
unsigned long
es la mejor opción si su implementación de libc no admite elz
modificador; el estándar C99 recomiendasize_t
no tener un rango de conversión de enteros mayor quelong
, por lo que está razonablemente seguro