2013-04-09 13 views
6

Próbuję napisać kod między platformami w C++ dla Windows (MinGW) i Linux (g ++). Byłem używany do definiowania 64-bitowych liczb całkowitych w systemie Linux jako "długi", ale kiedy przeniosłem się do MinGW, sizeof (long) zwrócił 4 bajty. Potem odkryłem, że mogę użyć "long long" lub "__INT64", aby zdefiniować 64-bitowe liczby całkowite w MinGW. Mam dwa pytania:Definicja cross-platform 64-bitowych liczb całkowitych w C++ dla Windows i Linux

1. Jaki jest najbardziej przenośny sposób definiowania 64-bitowych liczb całkowitych dla systemów Windows i Linux? Obecnie używam #ifdef, ale nie wiem, czy jest to najlepszy sposób, aby to zrobić:

#ifdef LINUX 
    #define INT64 long 
#elif WIN32 
    #define INT64 long long 
#endif 

2.- powinienem użyć „long long” czy „__INT64” w MinGW? i dlaczego?

+2

Cienki chciałeś powiedzieć "długo długo", nie "podwójnie podwójnie" – drahnr

+0

@drahnr mój zły, redagowałem post –

Odpowiedz

11

Można użyć typu int64_t, który jest zdefiniowany w nagłówku cstdint. Jest to standard jak w C++ 11.

Należy zauważyć, że ten typ może nie istnieć, jeśli platforma, której używasz, nie obsługuje 64-bitowych liczb całkowitych.

Jeśli chodzi o long long, jest to kolejna możliwość. long long s mają szerokość co najmniej 64-bitową. Zauważ, że jest standardem, podobnie jak w C++ 11, nawet jeśli będzie działał na kilku kompilatorach podczas używania C++ 03.

Jak wspomniał Pete Becker, można użyć int_least64_t. Jest to dobry wybór, jeśli nie masz nic przeciwko używaniu dokładnie 64-bitowych liczb całkowitych, ale jakiś integralny typ, który jest co najmniej szerokości 64 bitów.

+2

Prawdopodobnie lepszy wybór: 'int_least64_t', który zawsze będzie istnieć. –

+0

@PeteBecker ładne, dzięki. – mfontanini

+0

Nie rozumiesz: dokładny rozmiar typedefs jest opcjonalny, więc bardziej przenośny jest użycie typów najmniejszych i szybszych, jeśli nie potrzebujesz dokładnej liczby bitów. – rubenvb

2

Wierzę, że odpowiedź na pytanie, jak uzyskać 64-bitową liczbę całkowitą, została udzielona wystarczająco, ale zrobię ujęcie w drugim, czy użyć "long long" czy "__INT64". Najpierw musisz odpowiedzieć na pytanie, czego potrzebujesz. Jeśli z jakiegoś powodu potrzebujesz dokładnie 64-bitowe, należy użyć czegoś, co daje dokładnie te 64-bitowe, tj. Int64_t. Nawet jeśli twoja platforma/kompilator nie ma stdint.h, utwórz swój typedef jako odpowiedni typ jako obejście (# ifdef'd dla kompilatora), ponieważ sprawia, że ​​twój kod staje się bardziej samokomponowany. Z drugiej strony, jeśli zarządzasz np. przesunięcia w dużych segmentach pamięci (jak np. obraz DVD), użyj size_t lub ssize_t, ponieważ są one zwykle tej samej wielkości co wskaźnik, który również sam się dokumentuje. Podobnie przesunięcie w pliku najlepiej reprezentuje użycie fpos_t.

BTW: Założenie, że "długi" ma 64 bity w systemie Linux, jest błędne. W szczególności w przypadku wersji 32-bitowych jest to , a nie 64-bitowe i nie jestem również pewien, czy wszystkie 64-bitowe warianty używają 64-bitowych długości. Te różne systemy nazywane są ILP32, LP64 i LLP64. Szukaj tych warunków w sieci!

+0

Masz rację co do założenia, że ​​długi jest 64-bitowy w systemie Linux, powinienem być bardziej ostrożny z moim sformułowaniem. Dziękuję za odpowiedź. –

Powiązane problemy