在宏中,我需要按位而不是变量或结构,这是该宏的参数。
#define THE_C_MACRO(var) (someFunction(~var == var##_inv))
使用变量可以正常工作,但结构不起作用。有人知道一个简单的方法来获取宏中的结构而不是结构吗?
编辑:
对不起我问这个问题太快了。我必须确保一些变量在RAM中保存两次 - 正常和反向(由于某些规定)。我们构建了一些宏来帮助我们处理正常的变量。
我想把它扩展到结构。但也没有简单的方法来比较两个结构=>这不会那么容易。
答案 0 :(得分:2)
在一次操作中没有直接的方法来获得整个结构的“按位”。您可能需要对结构进行成员评估,除非您编写了类似于memset()
的函数:
void memnot(void *data, size_t length)
{
unsigned char *src = (unsigned char *)data;
while (length-- > 0)
*src = ~*src;
}
您的宏需要是以下之一:
#define BITWISE_INVERT_STRUCT(x) memnot(&(x), sizeof(x))
#define BITWISE_INVERT_STRUCTPTR(x) memnot(x, sizeof(*(x)))
如果这被证明是瓶颈,您可以考虑优化。例如,如果length是8个字节的倍数,则在uint64_t
上使用循环;如果它是4个字节的倍数,则在uint32_t
上使用循环;如果它是2个字节的倍数,则在uint16_t
上使用循环;否则使用此处显示的内容。这使得可能的激进假设是,如果结构是8字节长的倍数,则有效结构地址也将是8字节的倍数。情况不一定如此;诸如struct irksome { uint16_t a, b, c, d; };
之类的结构即使长度为8个字节也只需要2个字节的对齐。您可以对地址和大小进行其他更仔细/细微的分析,并决定是按字节顺序还是以更大的倍数进行操作。
名称memnot()
保留给实施(C99§7.26.11 - <string.h>
的未来方向)。
可以添加以str,mem或wcs开头的函数名称和小写字母 到标题中的声明。
您可能更喜欢使用mem_not()
或memNot()
或其他内容作为函数名称。