使用UINT64_C的目的?

NoS*_*tAl 3 c++ macros

我在boost源中找到了这一行:

const boost::uint64_t m = UINT64_C(0xc6a4a7935bd1e995);
Run Code Online (Sandbox Code Playgroud)

我想知道在这里使用MACRO的目的是什么?

所有这一切都是为了增加ULL所提供的常数.

我认为它可能会被用来使人们更难以打字UL而不是打字ULL,但我想知道是否有任何其他理由使用它.

Mil*_*nek 8

如果你看一下boost/cstdint.h,你会发现UINT64_C宏的定义在不同的平台和编译器上是不同的.

在某些平台上,它被定义为value##uL,在其他平台上value##uLL,而在其他平台上,它被定义为value##ui64.这完全取决于该平台的大小unsigned longunsigned long long特定于编译器的扩展.

我不认为UINT64_C在该上下文中实际使用是必要的,因为文字0xc6a4a7935bd1e995已经被解释为64位无符号整数.但在某些其他情况下这是必要的.例如,这里的文字0x00000000ffffffff将被解释为一个32位无符号整数,如果它没有通过使用特别指定为64位无符号整数UINT64_C(虽然我认为它将被提升为uint64_t按位AND运算).

无论如何,明确地声明文字的大小在其重要性方面起着重要作用,在代码清晰度方面起着重要作用.有时,即使某个操作完全由语言定义,人类程序员也很难说出涉及哪些类型.明确地说它可以使代码更容易推理,即使它不直接改变程序的行为.