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

Does C allow casting a struct type to itself?

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

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 等作为参数,其他类型作为数字进行类型定义并且可以正常工作:是否有任何解决方法?出于性能原因,我想避免使用 memcpy。

没有

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

Unless the type name specifies a void type, the type name shall specify atomic, qualified, or unqualified scalar type, and the operand shall have scalar type

换句话说,你根本无法施放struct

一个解决方法当然是删除右侧转换,或者进行按位复制:

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

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