Como AraK disse, a interface de fluxos c ++ sempre funcionará de maneira portável.
std :: size_t s = 1024; std :: cout << s; // ou qualquer outro tipo de stream como stringstream!
Se você deseja o C stdio, não há resposta portátil para isso em certos casos de "portable". E fica feio, pois, como você viu, escolher os sinalizadores de formato errado pode gerar um aviso do compilador ou gerar uma saída incorreta.
O C99 tentou resolver esse problema com formatos inttypes.h como "%" PRIdMAX "\ n". Mas, assim como em "% zu", nem todos são compatíveis com o c99 (como o MSVS anterior a 2013). Existem arquivos "msinttypes.h" flutuando para lidar com isso.
Se você converter para um tipo diferente, dependendo dos sinalizadores, poderá receber um aviso do compilador para truncamento ou alteração de sinal. Se você seguir esta rota, escolha um tipo de tamanho fixo relevante maior. Um de muito longo não assinado e "% llu" ou um longo "% lu" não assinado deve funcionar, mas o llu também pode desacelerar as coisas em um mundo de 32 bits como excessivamente grande. (Editar - meu mac emite um aviso em 64 bits para% llu que não corresponde a size_t, mesmo que% lu,% llu e size_t sejam todos do mesmo tamanho. E% lu e% llu não são do mesmo tamanho no meu MSVS2012. pode ser necessário transmitir + usar um formato que corresponda.)
Nesse caso, você pode usar tipos de tamanho fixo, como int64_t. Mas espere! Agora voltamos ao c99 / c ++ 11, e o MSVS mais antigo falha novamente. Além disso, você também tem lançamentos (por exemplo, map.size () não é do tipo de tamanho fixo)!
Você pode usar um cabeçalho ou biblioteca de terceiros, como aumento. Se você ainda não estiver usando um, talvez não queira aumentar seu projeto dessa maneira. Se você deseja adicionar um apenas para esse problema, por que não usar fluxos c ++ ou compilação condicional?
Então, você deve usar fluxos c ++, compilação condicional, estruturas de terceiros ou algo portátil que funcione para você.
unsigned long
é a melhor opção se sua implementação da libc não suportar oz
modificador; o padrão C99 recomendasize_t
não ter um número inteiro de conversão classificação maior do quelong
, assim que você é razoavelmente seguro