C是否允许将结构类型转换为自身?

时间:2015-05-18 13:15:10

标签: c visual-c++ visual-studio-2008 struct

所以我们有这样的结构类型:

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。

1 个答案:

答案 0 :(得分:4)

没有

需要此行为的(草案C11)标准文本在§6.5.4.2中:

  

除非类型名称指定void类型,否则类型名称应指定原子,限定或非限定标量类型,操作数应具有标量类型

换句话说,您无法完全投射struct s

一个修正当然可以是删除右侧的演员,或者做一个按位复制:

memcpy(ptr, &value, sizeof *ptr);

这可能会被优化掉,因为复制的尺寸非常小。请注意sizeof *ptr是一种更安全的选择,如果传入的sizeof value具有意外类型,使用value会有溢出的风险。