Meine 2 Cent aus Sicht der aktuellen Implementierung und für SWIG-Benutzer auf k8 (x86_64) -Architektur.
Linux
Erstens long long
und long int
sind verschiedene Typen abersizeof(long long) == sizeof(long int) == sizeof(int64_t)
Gcc
Versuchen Sie zunächst herauszufinden, wo und wie der Compiler int64_t und uint64_t definiert
grepc -rn "typedef.*INT64_TYPE" /lib/gcc
/lib/gcc/x86_64-linux-gnu/9/include/stdint-gcc.h:43:typedef __INT64_TYPE__ int64_t;
/lib/gcc/x86_64-linux-gnu/9/include/stdint-gcc.h:55:typedef __UINT64_TYPE__ uint64_t;
Wir müssen also diese Compiler-Makrodefinition finden
gcc -dM -E -x c /dev/null | grep __INT64
gcc -dM -E -x c++ /dev/null | grep __INT64
Clang
clang -dM -E -x c++ /dev/null | grep INT64_TYPE
Clang, GNU-Compiler:
-dM
Gibt eine Liste von Makros aus.
-E
druckt die Ergebnisse anstelle einer Datei nach stdout.
-x c
und -x c++
wählen Sie die Programmiersprache aus, wenn Sie eine Datei ohne Dateinamenerweiterung verwenden, z/dev/null
Ref: https://web.archive.org/web/20190803041507/http://nadeausoftware.com/articles/2011/12/c_c_tip_how_list_compiler_predefined_macros
Hinweis: Für Swig-Benutzer unter Linux x86_64 verwenden -DSWIGWORDSIZE64
Mac OS
Auf Catalina 10.15 IIRC
Clang
clang -dM -E -x c++ /dev/null | grep INT64_TYPE
Clang:
-dM
Gibt eine Liste von Makros aus.
-E
druckt die Ergebnisse anstelle einer Datei nach stdout.
-x c
und -x c++
wählen Sie die Programmiersprache aus, wenn Sie eine Datei ohne Dateinamenerweiterung verwenden, z/dev/null
Ref: https://web.archive.org/web/20190803041507/http://nadeausoftware.com/articles/2011/12/c_c_tip_how_list_compiler_predefined_macros
Hinweis: Für Swig-Benutzer wird unter macOS x86_64 nicht verwendet-DSWIGWORDSIZE64
Visual Studio 2019
Zuerst
sizeof(long int) == 4
undsizeof(long long) == 8
in haben stdint.h
wir:
#if _VCRT_COMPILER_PREPROCESSOR
typedef signed char int8_t;
typedef short int16_t;
typedef int int32_t;
typedef long long int64_t;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long long uint64_t;
Hinweis: Für Swig-Benutzer unter Windows x86_64 nicht verwenden-DSWIGWORDSIZE64
SWIG Stuff
Siehe zuerst https://github.com/swig/swig/blob/3a329566f8ae6210a610012ecd60f6455229fe77/Lib/stdint.i#L20-L24, damit Sie das typedef steuern können, indem Sie SWIGWORDSIZE64
...
jetzt das schlechte: SWIG Java und SWIG CSHARP berücksichtigen es nicht
Vielleicht möchten Sie also verwenden
#if defined(SWIGJAVA)
#if defined(SWIGWORDSIZE64)
%define PRIMITIVE_TYPEMAP(NEW_TYPE, TYPE)
%clear NEW_TYPE;
%clear NEW_TYPE *;
%clear NEW_TYPE &;
%clear const NEW_TYPE &;
%apply TYPE { NEW_TYPE };
%apply TYPE * { NEW_TYPE * };
%apply TYPE & { NEW_TYPE & };
%apply const TYPE & { const NEW_TYPE & };
%enddef
PRIMITIVE_TYPEMAP(long int, long long);
PRIMITIVE_TYPEMAP(unsigned long int, long long);
#undef PRIMITIVE_TYPEMAP
#endif
#endif
und
#if defined(SWIGCSHARP)
#if defined(SWIGWORDSIZE64)
%define PRIMITIVE_TYPEMAP(NEW_TYPE, TYPE)
%clear NEW_TYPE;
%clear NEW_TYPE *;
%clear NEW_TYPE &;
%clear const NEW_TYPE &;
%apply TYPE { NEW_TYPE };
%apply TYPE * { NEW_TYPE * };
%apply TYPE & { NEW_TYPE & };
%apply const TYPE & { const NEW_TYPE & };
%enddef
PRIMITIVE_TYPEMAP(long int, long long);
PRIMITIVE_TYPEMAP(unsigned long int, unsigned long long);
#undef PRIMITIVE_TYPEMAP
#endif
#endif
Also wird int64_t
aka long int
unter Java an Java / C # long
gebunden ...
sizeof(long) == 4