C++ Visual Studio 编译器中的 `LL` 与 `i64` 后缀

`LL` vs `i64` suffix in C++ Visual Studio compiler

我正在尝试重构旧的 C++ 代码。在某些时候我有这样的东西:

#if defined(WIN32) && !(defined(__CYGWIN__) || defined(__MINGW32__))
#  define I64_CONST(X)  X ## i64
#else
#  define I64_CONST(X)  X ## LL
#endif

所以为了在代码中定义 64 位文字,有类似的东西:

(uint32_t)((data_in >> 32) & I64_CONST(0x00000000ffffffff));

这是为了在 Microsoft 编译器中使用 i64 后缀,在其他编译器中使用 LL。因为我正在为 C++17 调整它并且我们的最低要求是使用 Visual Studio 2019,是否可以删除它并在任何地方使用 LL,或者是否存在一些问题并且它是更好地保持编译器之间的区别?

是的,long long 是一个 new type since C++11,它至少包含 64 位,因此它可以用于您的文字(除非源代码使用二进制补码并且编译器使用一个 complement/sign-magnitude 然后 -263 不适合)

另一种方法是使用<cstdint>中的INT64_C,这也是在C++11

中引入的
#define I64_CONST INT64_C
auto v = INT64_C(0xFFFF0000FFFF0000);