3 votes

Suffixe `LL` vs `i64` dans le compilateur C++ Visual Studio

J'essaie de remanier un vieux code C++. A un moment donné, j'ai quelque chose comme :

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

Donc pour définir un littéral 64 bits dans le code, il y a quelque chose comme :

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

Il s'agit d'utiliser i64 avec les compilateurs Microsoft et LL avec d'autres. Comme je l'adapte pour C++17 et que l'exigence minimale que nous avons est d'utiliser Visual Studio 2019, est-il possible de supprimer cela et d'utiliser LL partout, ou y a-t-il un problème et il est préférable de maintenir la distinction entre les compilateurs ?

7voto

Lưu Vĩnh Phúc Points 3183

Oui, long long est un nouveau type depuis C++11 qui contient au moins 64 bits, donc il peut être utilisé pour vos littéraux (à moins que le code source utilise le complément à deux et que le compilateur utilise le complément à un/signe-magnitude alors -2 63 ne conviennent pas)

Une autre façon est d'utiliser le INT64_C en <cstdint> qui a également été introduit dans C++11

#define I64_CONST INT64_C
auto v = INT64_C(0xFFFF0000FFFF0000);

Véase Pourquoi utiliser UINT64_C ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X