我的 2 美分,
从当前实现的角度来看,对于 k8 (x86_64) 架构上的 SWIG 用户。
Linux
首先long long 和long int 是不同的类型
但是sizeof(long long) == sizeof(long int) == sizeof(int64_t)
GCC
首先尝试找出编译器在哪里以及如何定义 int64_t 和 uint64_t
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;
所以我们需要找到这个编译器宏定义
gcc -dM -E -x c /dev/null | grep __INT64
#define __INT64_C(c) c ## L
#define __INT64_MAX__ 0x7fffffffffffffffL
#define __INT64_TYPE__ long int
gcc -dM -E -x c++ /dev/null | grep __INT64
#define __INT64_C(c) c ## L
#define __INT64_MAX__ 0x7fffffffffffffffL
#define __INT64_TYPE__ long int
叮当
clang -dM -E -x c++ /dev/null | grep INT64_TYPE
#define __INT64_TYPE__ long int
#define __UINT64_TYPE__ long unsigned int
Clang,GNU 编译器:
-dM 转储宏列表。
-E 将结果打印到标准输出而不是文件。
-x c 和 -x c++ 选择编程语言时使用没有文件扩展名的文件,例如/dev/null
参考:https://web.archive.org/web/20190803041507/http://nadeausoftware.com/articles/2011/12/c_c_tip_how_list_compiler_predefined_macros
注意:对于 swig 用户,在 Linux x86_64 上使用 -DSWIGWORDSIZE64
MacOS
在 Catalina 10.15 IIRC 上
叮当
clang -dM -E -x c++ /dev/null | grep INT64_TYPE
#define __INT64_TYPE__ long long int
#define __UINT64_TYPE__ long long unsigned int
Clang:
-dM 转储宏列表。
-E 将结果打印到标准输出而不是文件。
-x c 和 -x c++ 在使用文件时选择编程语言没有文件扩展名,例如/dev/null
参考:https://web.archive.org/web/20190803041507/http://nadeausoftware.com/articles/2011/12/c_c_tip_how_list_compiler_predefined_macros
注意:对于 swig 用户,在 macOS x86_64 不要使用-DSWIGWORDSIZE64
Visual Studio 2019
首先
sizeof(long int) == 4 和 sizeof(long long) == 8
在stdint.h 我们有:
#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;
注意:对于 swig 用户,在 windows x86_64 不要使用-DSWIGWORDSIZE64
SWIG 东西
首先查看https://github.com/swig/swig/blob/3a329566f8ae6210a610012ecd60f6455229fe77/Lib/stdint.i#L20-L24,这样您就可以使用SWIGWORDSIZE64 控制typedef 但是...
现在不好了:SWIG Java 和 SWIG CSHARP 不要考虑它
所以你可能想使用
#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
PRIMITIVE_TYPEMAP(long int, long long);
PRIMITIVE_TYPEMAP(unsigned long int, long long);
#undef PRIMITIVE_TYPEMAP
#endif // defined(SWIGWORDSIZE64)
#endif // defined(SWIGJAVA)
和
#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
PRIMITIVE_TYPEMAP(long int, long long);
PRIMITIVE_TYPEMAP(unsigned long int, unsigned long long);
#undef PRIMITIVE_TYPEMAP
#endif // defined(SWIGWORDSIZE64)
#endif // defined(SWIGCSHARP)
所以int64_t aka long int 将在 Linux 上绑定到 Java/C# long...