给定以下代码:
#include <stdlib.h>
#include <stdio.h>
enum some_enum
{
garbage1,
garbage2
};
int main(void)
{
enum some_enum some_val;
printf("size: %lu\n", sizeof(some_val));
return EXIT_SUCCESS;
}
目前它会打印出4,但我希望能够强制大小为8。在枚举分配中尝试指定大于4个字节的值会引发警告。例如:
enum some_enum
{
garbage1 = '12345',
garbage2
};
会产生:
warning: character constant too long for its type [enabled by default]
这里有一个类似问题的答案,但似乎没有给出好的结果。也就是说,以下代码会产生相同的警告:
enum some_enum
{
garbage1 = 'adfs',
garbage2 = 'asdfasdf'
};
注意:可以通过编译
-Wno-multichar
来关闭多字符警告。
原理
由于人们对我为什么这样做感到兴趣,我编写了一个反汇编引擎。我将指令的每个部分作为字符串获取。因此,我希望枚举看起来像这样:
enum mnemonic
{
mov = 'mov',
cmp = 'cmp',
sysenter = 'sysenter'
};
我可以使用以下代码轻松地存储语义信息: ```python 我能够使用如下代码轻松地存储语义信息: ```
enum mnemonic insn;
char * example_insn = "mov";
uint64_t buf = 0;
strncpy((char *)&buf, example_insn, sizeof(uint64_t));
如果
buf
是一个枚举助记符
,那么我们不需要做任何其他的事情。 strncpy
用于将字符串结束后的字节填充为null字符。如果我无法做到这一点,我将不得不执行以下操作:if(strcmp(example_insn, "mov") == 0) {
insn = mov;
} else if(strcmp(example_insn, "cmp") == 0) {
insn = cmp;
} ...
由于这个例程会被执行数百万次,这种优化会有很大的影响。我也打算对诸如寄存器等操作数进行相同的优化。
enum
。 - Dan Fego'
- 在x64上使用gcc
不会收到任何警告。 - Matteo Italia'ABC'
是某些非标准的 MSVC 扩展,用于'A'<<(u*CHAR_BIT) | 'B'<<(v*CHAR_BIT) | 'C'<<(w*CHAR_BIT)...
,其中 u、v、w 等与实数集之间存在着实现定义映射。 - jørgensen