【问题标题】:Conditional compilation in GoGo 中的条件编译
【发布时间】:2012-06-23 23:24:00
【问题描述】:

我正在尝试使用 CGoENet 编写 Go wrapper

当我尝试在 Mac 上编译我的包装器时,库较旧并且界面略有不同。 99% 的代码是相同的,只是需要更改几个 C 调用。

在 Go 中处理此类问题的最佳做法是什么?
有没有办法进行条件编译或条件导入?

【问题讨论】:

    标签: go cgo


    【解决方案1】:

    将特定于平台的内容分离到一个单独的文件中,例如stuff.go

    现在将 stuff.go 替换为不同平台的版本,例如 stuff_darwin.go(适用于 Mac)、stuff_windows.go、stuff_linux.go 等。

    如果文件有这样的后缀,go 命令只会在指定的平台上编译它。

    【讨论】:

    • 在 go/build 包的 overview 中的“Build Constriants”下记录。
    • 很棒的信息,绝对是解决操作系统不兼容问题的正确答案。然而,我的问题的根源是不同的库版本,所以我选择了直接解决这个问题的答案。
    【解决方案2】:

    Go 没有条件编译或条件导入。处理 C 代码中的类型差异。

    Are the [Go] authors opposed to preprocessing?

    【讨论】:

    • Go 实际上确实使用文件名后缀进行条件编译,正如 andyBallholm 的回答所示。
    • 反对者会讨厌:)。不过说真的,@peterSO 对我的特定问题有正确的答案。事实证明,Mac 是一条红鲱鱼。真正的问题在于库版本,它只能在头文件中检测为#define_darwin.go_linux.go 只会掩盖问题,直到其中一个使用向后不兼容的更改更新其 ENet 库。
    猜你喜欢
    • 2018-03-14
    • 2023-03-04
    • 2012-10-08
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多