我在我的一个项目中使用C++ 11,并且想知道如何最好地表示ELF幻数.我不是十六进制文字的粉丝,所以我一直在寻找比以下更好的东西:
const uint32 ELF_MAGIC_NUMBER = 0x7F454c46; // 0x7F, E, L, F
Run Code Online (Sandbox Code Playgroud)
所以,我试着写:
const uint32 ELF_MAGIC_NUMBER = { 0x7F, 'E', 'L', 'F' };
Run Code Online (Sandbox Code Playgroud)
但编译器抱怨初始化列表中的项目太多,这是可以理解的,虽然很烦人.
有没有办法按字节写一个整数文字?我觉得第一个选项,虽然它有效,但在第二个选项上并不可读.
And*_*owl 18
既然你可以买得起C++ 11,你就可以定义一个小constexpr帮助器,它可以启用编译时评估:
#include <cstdint>
constexpr std::uint32_t from_bytes(char b1, char b2, char b3, char b4)
{
return b4 +
(static_cast<std::uint32_t>(b3) << 8) +
(static_cast<std::uint32_t>(b2) << 16) +
(static_cast<std::uint32_t>(b1) << 24);
}
Run Code Online (Sandbox Code Playgroud)
这样,您的代码与原始版本看起来没什么不同:
const std::uint32_t ELF_MAGIC_NUMBER = from_bytes(0x7F, 'E', 'L', 'F');
int main()
{
static_assert(ELF_MAGIC_NUMBER == 0x7F454c46, "!");
}
Run Code Online (Sandbox Code Playgroud)
这是一个实例.
许多编译器都有这个鲜为人知的特性:多字符字符文字.
uint32 ELF_MAGIC_NUMBER = '\177ELF';
Run Code Online (Sandbox Code Playgroud)
我担心,你必须使用八进制数字作为非字符.
啊,差点忘了!这意味着编译器依赖,所以我不会这样做.
但是如果你可以使用C++ 11,你可以使用constexpr和用户定义的文字:
constexpr uint32_t operator "" _mc (const char *str, size_t len)
{
return len==4?
(str[0] << 24) | (str[1] << 16) | (str[2] << 8) | str[3] :
throw "_mc literal must be of length 4";
}
constexpr uint32_t ELF_MAGIC_NUMBER = "\177ELF"_mc;
Run Code Online (Sandbox Code Playgroud)
这有一个很好的功能,你可以使用字符串连接来使用十六进制字符:
constexpr uint32_t ELF_MAGIC_NUMBER = "\x7F""ELF"_mc;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
696 次 |
| 最近记录: |