Pergunta

Ao contrário de Java ou C#, os tipos de dados primitivos em C++ podem variar em tamanho dependendo da plataforma.Por exemplo, int não é garantido que seja um número inteiro de 32 bits.Vários ambientes de compilador definem tipos de dados como uint32 ou dword para esse propósito, mas parece não haver um arquivo de inclusão padrão para tipos de dados de tamanho fixo.

Qual é o método recomendado para obter portabilidade máxima?

Foi útil?

Solução

Achei este cabeçalho particularmente útil:Aumente o cstdint

Geralmente melhor do que inventar a roda própria (que incorre na manutenção e teste).

Outras dicas

Crie um arquivo de cabeçalho chamado types.h e defina todos os tipos primitivos de tamanho fixo que você precisa (int32, uint32, uint8, etc.). Para suportar várias plataformas, você pode usar #ifdef's ou possui um diretório incluído separado para cada plataforma (incluir_x86, incluir_x86_64, include_sparc). Neste último caso, você teria configurações de construção separadas para cada plataforma, que teriam o diretório incluído direito em seu caminho de incluir. O segundo método é preferível, de acordo com o "The C ++ Gotchas", de Stephen Dewhurst.

Apenas um aparte, se você planeja aprovar dados binários entre diferentes plataformas, também precisa se preocupar com a ordem de bytes.

Parte do padrão C99 era um arquivo de cabeçalho STDINT.H para fornecer esse tipo de informação. Por exemplo, ele define um tipo chamado uint32_t. Infelizmente, muitos compiladores não suportam stdint.h. A melhor implementação de plataforma cruzada que eu vi de stdint.h está aqui: http://www.azillionmonkeys.com/qed/pstdint.h. Você pode incluir isso em seu projeto.

Se você está usando o Boost, acredito que também fornece algo equivalente ao cabeçalho do stdint.

Defina um tipo (por exemplo, int32) em um arquivo de cabeçalho. Para cada plataforma, use outro #IFDEF e verifique se o IN32 é um número inteiro de 32 bits. Em todos os lugares do seu código, use o Int32 e verifique se, quando você compilar em diferentes plataformas que usa o direito, defina

Duas coisas:

Primeiro, existe um arquivo de cabeçalho chamado Limits.H que fornece muitas informações específicas da plataforma úteis. Ele fornecerá valores max e min para o tipo int, por exemplo. A partir disso, você pode deduzir o tamanho do tipo int.

Você também pode usar o operador de tamanho de tempo de execução para esses fins.

Eu espero que isso ajude . . .

K

Se seu nome começar com dois sublinhados (__), um tipo de dados não é padrão.

__int8 (não assinado __int8)

__int16 (__int16 não assinado)

__int32 (__int32 não assinado)

__int64 (__int64 não assinado)

Tente usar boost/cstdint.hpp

Existe um cabeçalho stdint.h definido pelo padrão C99 e (eu acho) alguma variante ou outra do ISO C++.Isso define tipos legais como int16_t, uint64_t, etc...que têm garantia de tamanho e representação específicos.Infelizmente, sua disponibilidade não é exatamente padrão (a Microsoft, em particular, foi arrastada aqui).

A resposta simples é esta, que funciona em todas as arquiteturas endereçáveis ​​​​de bytes de 32 ou 64 bits que conheço:

  • Todas as variáveis ​​​​char têm 1 byte
  • Todas as variáveis ​​curtas têm 2 bytes
  • Todas as variáveis ​​​​int têm 4 bytes
  • NÃO use um "longo", que é de tamanho indeterminado.
  • Todos os compiladores conhecidos com suporte para matemática de 64 bits permitem "long long" como um tipo nativo de 64 bits.

Esteja ciente de que alguns compiladores de 32 bits não possuem um tipo de 64 bits, portanto, usar long long limitará você a sistemas de 64 bits e um conjunto menor de compiladores (que inclui gcc e MSVC, então a maioria das pessoas não se importará com este problema).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top