Possible Duplicate:
How do you compare structs for equality in C?
在宏中,我需要作为该宏的参数的变量或结构的按位非。
#define THE_C_MACRO(var) (someFunction(~var == var##_inv))
这对于变量来说工作得很好,但是对于结构来说就不行了。有人知道在宏中获取结构体按位非的简单方法吗?
编辑:
抱歉我问这个问题太快了。我必须确保某些变量在 RAM 中保存两次 - 正态和逆态(由于某些规定)。我们构建了一些宏来帮助我们处理普通变量。
我想将其扩展到结构。但也没有简单的方法来比较两个结构=>这不会那么容易。
最佳答案
没有直接的方法可以在一次操作中获得整个结构的“按位非”。您可能需要对结构进行逐成员评估,除非您编写了类似于 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)))
如果这被证明是瓶颈,您可以考虑优化。例如,如果长度是 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>
的 future 方向)。
Function names that begin with str, mem, or wcs and a lowercase letter may be added to the declarations in the header.
您可能更喜欢使用mem_not()
或memNot()
或其他名称作为函数名称。
关于C:按位非结构体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7832312/