2015-08-25 12 views
5

Używamy szablonu specjalizacji jakiegoś parametru typu jakunsigned długi długi konflikt z uint64_t?

class my_template_class<uint64_t M>: public my_template_class_base<uint64_t> { 
.... 
} 

class my_template_class<unsigned long long,M>: public my_template_class_base<unsigned long long> { 
.... 
} 

Jest to doskonale współpracuje z 64-bitowych kompilacji z gcc. Kiedy próbujemy trybu 32-bitowego, zgłasza "poprzednią definicję" dla powyższych dwóch klas.

Więc unsigned long long jest taki sam jak uint64_t w 32-bitowej kompilacji, ale nie w wersji 64-bitowej?

Różnica kompilacja jest CXX flag -m32 i -m64

+5

@ FrédéricHamidi: Mało prawdopodobne; Nigdy nie widziałem systemu z 128-bitowym 'unsigned long long'. –

+0

Do czego faktycznie się kompiluje uint64_t? Nie mam GCC pod ręką, ale możesz sprawdzić nagłówek stdint. Prawdopodobnie dałoby kilka wskazówek, co faktycznie widzi kompilator. – BlamKiwi

+1

Jestem całkiem pewien, że na 64-bitowej platformie, 'uint64_t' jest zdefiniowany jako' unsigned long', a zatem nie jest w konflikcie z 'unsigned long long', podczas gdy na 32-bitowej platformie,' uint64_t' musi być 'unsigned long long', podając swój błąd – NiBZ

Odpowiedz

12

Więc unsigned long long jest taka sama jak uint64_t w kompilacji 32-bitowej, ale nie w 64-bitowych kompilacji?

Tak.

W trybie 32-bitowym najprawdopodobniej long ma 32 bity, a long long ma 64 bity. W trybie 64-bitowym oba mają prawdopodobnie 64 bity.

W trybie 32-bitowym, kompilator (dokładniej nagłówek <stdint.h>) określa uint64_t jak unsigned long long, ponieważ unsigned long nie jest wystarczająco szerokie.

W trybie 64-bitowym definiuje uint64_t jako unsigned long.

Możezdefiniował go jako unsigned long long w obu trybach. Wybór jest arbitralny; wszystko, co jest wymagane, to to, że musi być typu 64-bitowego.

Ogólnie rzecz biorąc, każdy z typów liczb całkowitych zdefiniowany w <stdint.h> jest typedef dla niektórych predefiniowanych typów o odpowiednich właściwościach. Nie można założyć, że którykolwiek z nich różni się od wstępnie zdefiniowanych typów.

+0

W systemie Windows 'uint64_t' musi być zdefiniowany jako' unsigned long long', long is only 32 bit https://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models –

+0

@ LưuVĩnhPhúc: Zostało zdefiniowane jako '__uint64 "w przeszłości. Na ogół nie jest określone, czy dwa typy z identyczną reprezentacją są w rzeczywistości tego samego typu; wyjątek to "char" kontra "signed char" lub "unsigned char", dla którego zdefiniowano, że są to 3 typy i 2 reprezentacje. – MSalters

+0

@MSalters: Aby było jasne, wszystkie predefiniowane typy są różne, niezależnie od ich reprezentacji. Na przykład "int" i "long" są różnymi typami, nawet jeśli mają ten sam rozmiar i reprezentację. Jeśli odnosisz się do typów zdefiniowanych w standardowych nagłówkach, takich jak 'int32_t', masz rację. –

4

to jest z stdint.h dla GCC 4.8:

#if __WORDSIZE == 64 
typedef unsigned long int uint64_t; 
#else 
__extension__ 
typedef unsigned long long int uint64_t; 
#endif 

Więc:

Więc unsigned long long jest taka sama jak uint64_t w compliation 32bit ale nie w 64 bitowej compliation?

Tak.

+0

Tak, dla GCC. Nie zakładaj, że to prawda wszędzie. Visual Studio na przykład ma bezwarunkowe 'unsigned long-uped64 typu długopis bez znaku' – MSalters