我正在整理一些旧的代码,这些代码使用"幻数"来设置硬件寄存器,我想使用常量而不是这些数字来使代码更具表现力(实际上它们将映射到名称/用于记录寄存器的值).
但是,我担心随着变化的数量,我可能会打破神奇的数字.这是一个简化的例子(寄存器集更复杂):
const short mode0 = 0;
const short mode1 = 1;
const short mode2 = 2;
const short state0 = 0;
const short state1 = 4;
const short state2 = 8;
Run Code Online (Sandbox Code Playgroud)
而不是:
set_register(5);
Run Code Online (Sandbox Code Playgroud)
我们有:
set_register(state1|mode1);
Run Code Online (Sandbox Code Playgroud)
我正在寻找的是构建时间版本:
ASSERT(5==(state1|mode1));
Run Code Online (Sandbox Code Playgroud)
更新
@Christian,感谢快速响应,我对C/non-boost环境的答案感兴趣,因为这是驱动程序/内核代码.
如题。
例如,假设我们有一个int8_t值“-10”,我想在我的程序中动态检查(运行时值)是否-10可以在uint32_t变量之后安全地保存这个确切的整数值std::trunc。在这种情况下,由于这是一个负值,所以它不能被无符号类型保存。我怎样才能在 C++ 代码中做到这一点?因为如果我使用正常的比较方式,隐式转换会破坏如下所示的类型信息。有没有其他简单的方法可以做到这一点?
int8_t v = -10;
if (v <= std::numeric_limits<uint32_t>::max() &&
v >= std::numeric_limits<uint32_t>::min()) {
// It will be true here.
}
Run Code Online (Sandbox Code Playgroud)
我想找到一种健全的方法来检查目标类型的可用值范围是否可以完全覆盖源类型的所有可用值。意思是显式转换后,结果值应该与原始值完全相同。