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
将有溢出的风险。
所以我们有这样的结构类型:
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
将有溢出的风险。