本文详解 go 与 c 互操作中“从 c 调用 go 函数”的标准实践,重点解决因重复声明、头文件包含不当导致的 `conflicting types for ‘dummy’` 编译错误,并提供可直接运行的结构化示例。
在 Go 中通过 //export 指令将函数暴露给 C 使用,是实现 Go/C 混合编程的关键能力。但初学者常因 C 端声明方式不当而触发编译失败——典型错误如 conflicting types for ‘dummy’,其根源在于:Go 的 cgo 工具会自动生成 _cgo_export.c,其中已声明并定义了 dummy() 的 C 签名(int dummy(void)),若你在手动编写的 C 文件(如 wrapper.c)中再次用 extern int dummy(); 声明,就会与生成代码冲突。
✅ 正确做法是:C 端只声明需调用的 包装函数(如 testc),绝不声明 Go 导出函数本身;Go 导出函数的签名由 cgo 自动管理,C 代码只需按约定调用即可。
以下为推荐的工程化结构(三文件分离):
1. 头文件 dummy.h(仅声明 C 接口)