我无法找到如何制作C风格的联盟。在documentation中给出的示例中:
(define a-union-type
(_union (_list-struct _int _int)
(_list-struct _double _double)))
(define a-union-val
(cast (list 3.14 2.71)
(_list-struct _double _double)
a-union-type))
一切正常。但如果转换为_int:
(define a-union-val
(cast (list 3 2)
(_list-struct _int _int)
a-union-type))
我收到以下错误:
cast: representation sizes of from and to types differ
size of from type: 8
size of to size: 16
哪种方式有道理,但问题是,如何建立这种联盟?
你能解释一下make-union-type和_union之间的区别吗?因为我从文档中不清楚。
非常感谢。
答案 0 :(得分:1)
仅在(ctype-sizeof from-type)
等于(ctype-sizeof to-type)
时才进行投射,因此只允许最大的联合变体。尝试使用手动分配和union-set!
代替:
(define a-union-val (ptr-ref (malloc a-union-type) a-union-type))
(union-set! a-union-val 0 (list 3 2))
union-set!
的第二个参数是您想要的变体的索引。