Domanda

A differenza di Java o C#, i tipi di dati primitivi in ​​C++ possono variare in dimensioni a seconda della piattaforma.Per esempio, int non è garantito che sia un numero intero a 32 bit.Vari ambienti di compilazione definiscono tipi di dati come uint32 O dword per questo scopo, ma sembra che non esista un file di inclusione standard per i tipi di dati a dimensione fissa.

Qual è il metodo consigliato per ottenere la massima portabilità?

È stato utile?

Soluzione

Ho trovato particolarmente utile questa intestazione:BOOST cstdint

Di solito è meglio che inventare la propria ruota (che comporta manutenzione e test).

Altri suggerimenti

Crea un file di intestazione chiamatotypes.h e definisci tutti i tipi primitivi a dimensione fissa necessari (int32, uint32, uint8 e così via).Per supportare più piattaforme, puoi utilizzare #ifdefo avere una directory di inclusione separata per ciascuna piattaforma (include_x86, include_x86_64, include_sparc).In quest'ultimo caso avresti configurazioni di build separate per ciascuna piattaforma, che avrebbero la directory di inclusione corretta nel percorso di inclusione.Secondo "The C++ Gotchas" di Stephen Dewhurst è preferibile il secondo metodo.

Per inciso, se hai intenzione di trasferire dati binari tra diverse piattaforme, devi preoccuparti anche dell'ordine dei byte.

Parte dello standard C99 era un file di intestazione stdint.h per fornire questo tipo di informazioni.Ad esempio, definisce un tipo chiamato uint32_t.Sfortunatamente, molti compilatori non supportano stdint.h.La migliore implementazione multipiattaforma che ho visto di stdint.h è qui: http://www.azillionmonkeys.com/qed/pstdint.h.Puoi semplicemente includerlo nel tuo progetto.

Se stai utilizzando boost, credo che fornisca anche qualcosa di equivalente all'intestazione stdint.

Definire una tipologia (es.int32) in un file di intestazione.Per ogni piattaforma usa un altro #ifdef e assicurati che in32 sia un intero a 32 bit.Ovunque nel tuo codice usa int32 e assicurati che quando compili su piattaforme diverse usi la definizione corretta

Due cose:

Innanzitutto, esiste un file di intestazione chiamato limiti.h che fornisce molte informazioni specifiche della piattaforma utili.Ad esempio, fornirà i valori massimo e minimo per il tipo int.Da ciò puoi dedurre quanto è grande il tipo int.

Per questi scopi è inoltre possibile utilizzare l'operatore sizeof in fase di esecuzione.

Spero che aiuti ...

K

Se il nome inizia con due caratteri di sottolineatura (__), un tipo di dati non è standard.

__int8 (senza segno __int8)

__int16 (senza segno __int16)

__int32 (senza segno __int32)

__int64 (senza segno __int64)

Prova ad usare boost/cstdint.hpp

C'è un'intestazione stdint.h definita dallo standard C99 e (credo) qualche variante o un'altra di ISO C++.Questo definisce tipi carini come int16_t, uint64_t, ecc...che sono garantiti per avere una dimensione e una rappresentazione specifiche.Sfortunatamente, la sua disponibilità non è esattamente standard (Microsoft in particolare è stata un trascinatore qui).

La risposta semplice è questa, che funziona su ogni architettura indirizzabile in byte a 32 o 64 bit di cui sono a conoscenza:

  • Tutte le variabili char sono 1 byte
  • Tutte le variabili brevi sono 2 byte
  • Tutte le variabili int sono 4 byte
  • NON utilizzare un "lungo", che è di dimensioni indeterminate.
  • Tutti i compilatori conosciuti con supporto per la matematica a 64 bit consentono "long long" come tipo nativo a 64 bit.

Tieni presente che alcuni compilatori a 32 bit non hanno affatto un tipo a 64 bit, quindi l'uso di long long ti limiterà a sistemi a 64 bit e a un insieme più piccolo di compilatori (che include gcc e MSVC, quindi alla maggior parte delle persone non importerà questo problema).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top