所以我们有这样的结构类型:
typedef struct
{
U64 low;
U64 high;
} U128;
然后作为宏扩展的结果在代码中的某处有一个像这样的赋值:
*ptr = (U128)value;
ptr
属于U128*
的位置。这会导致以下错误:
error C2440: 'type cast' : cannot convert from 'U128' to 'U128'
问题是:C中是否允许这样的自我演员?我刚刚发现编译器错误吗?
其他问题:
这是一个通用宏,允许8,16,32,64,128等作为参数,其他类型的typedefd作为数字并且没有问题:是否有任何解决方法?出于性能原因,我想避免使用memcpy。
答案 0 :(得分:4)
没有
需要此行为的(草案C11)标准文本在§6.5.4.2中:
除非类型名称指定void类型,否则类型名称应指定原子,限定或非限定标量类型,操作数应具有标量类型
换句话说,您无法完全投射struct
s 。
一个修正当然可以是删除右侧的演员,或者做一个按位复制:
memcpy(ptr, &value, sizeof *ptr);
这可能会被优化掉,因为复制的尺寸非常小。请注意sizeof *ptr
是一种更安全的选择,如果传入的sizeof value
具有意外类型,使用value
会有溢出的风险。