我有一个像这样定义的C宏:
#define normalize(c, a) c = (a) + ((a) == 0xFFFFFFFF)
我在Go中重写它,只要我知道Go中没有C宏这样的东西。因此,我创建了一个正常的函数:
func normalize(a uint32, c *uint32) {
*c = a + (a == 0xFFFFFFFF)
}
问题是这给了我一个类型不匹配的错误。任何想法如何解决它?
答案 0 :(得分:2)
因此,如果normalize
不等于c
,则您的C a
宏会将a
分配给0xffffffff
,否则会分配给0
。我不确定它是什么样的规范化,但现在不是我的关注。
因此,鉴于您提供的Go函数签名,这将起作用:
func normalize(a uint32, c *uint32) {
if a != 0xffffffff {
*c = a
} else {
*c = 0
}
}
但是,我不确定为什么不返回值而不是通过c
指针写入?
func normalize(a uint32) {
if a != 0xffffffff {
return a
}
return 0
}
旁注:这同样适用于您的C宏。顺便说一句,宏评估a
两次,如果你传递一些带有副作用的函数a
,这可能会让你大吃一惊。有什么理由不使用(内联)函数而不是宏,或至少使它评估为新值,而不是为它分配c
?