定义uint64_t常量的最佳/正确方法
Best/proper way to define uint64_t constants
constexpr auto v = static_cast<std::uint64_t>(1) << 32;
并不理想,因为繁琐的语法和语义间接的强制转换。从这个线程中,我学到了constexpr auto v = UINT64_C(1) << 32;
但是,宏的精确语义是
扩展为具有指定值的整数常量表达式 通过其参数和类型
uint_least64_t
.
因此,这并不完全是uint64_t
.我想知道定义uint64_t
常量的最佳/正确方法是什么。
请注意,unsigned long long
不一定映射到uint64_t
。
更新
我不愿意使用函数式/C 风格的转换,因为有些人(例如,Google C++ Coding Style)说它来自 C,现代C++应该避免使用它们。看来我应该对此有自己的看法,而不是盲目跟随别人。
因此,它并不完全
uint64_t
。我想知道定义uint64_t
常量的最佳/正确方法是什么。
如果你想绝对确定,你可以写uint64_t(1)
(可能std::
合格的)作为你static_cast
的更短的替代品。
出于实际目的,UINT64_C
很好。如果实现不提供任何满足其要求的类型,则不需要定义uint64_t
。因此,根据uint_least64_t
来定义UINT64_C
是有意义的。
但是在确实存在uint64_t
的实现上 - 并且你已经隐含地假设你正在使用这样的实现 -uint64_t
和uint_least64_t
必须具有完全相同的范围,这几乎需要实现者的恶意,而不是使它们完全相同的类型。
附言由于这是标记为语言律师:不能保证uint64_t(1) << 32
仍然具有类型uint64_t
。假设,实现可以提供大于 64 位的int
类型,在这种情况下,uint64_t
将提升为int
。
正是有说明符的,使用L
使您的整数文字成为long
,LL
long long
,ULL
unsigned long long
,或者,uint64_t
(大多数时候)。
或者只是auto
一起删除,让编译器进行隐式强制转换。
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 检测win32服务创建和删除的最佳方法
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 将线程中的数据存储到全局容器的最佳方法?
- 将一系列整数放入类的最佳方法是什么?
- 在派生类中使用基类的私有成员变量的最佳方法
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 比较两个节点坐标的最佳方法是什么?
- 在nodejs中使用本机代码的最佳方法是什么?
- 将 pybind11 绑定标记为已弃用的最佳方法
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- C++中变量混叠的最佳方法
- 转换/映射方法最佳做法