golang 中的 C 风格条件编译
C-style conditional compilation in golang
golang是否支持
#define DEBUG
#ifdef DEBUG
fmt.Println("Debug message...");
#endif
所以我可以构建一个运行时开销为零的调试版本?
Go 没有预处理器或宏系统。您可以做的是传入标签以通过 -tags
标志进行构建并使用构建约束。为此,您需要同一来源的两个版本,并且只有一个版本会根据标签是否存在而构建。
查看 https://golang.org/pkg/go/build/
中的构建约束
main_debug.go
// +build debug
package main
import (
"fmt"
)
func main() {
fmt.Println("Debug build")
}
main_release.go
// +build !debug
package main
import (
"fmt"
)
func main() {
fmt.Println("Release build")
}
此处 go build
将使用 main_release.go 进行编译,而 go build -tags debug
将使用 main_debug.go
进行编译
如果您在 linux 或 Mac 上工作,您可以尝试“m4" command.This 命令是一个 宏 处理器,正好适合这个问题。
在"go build"之前为运行m4命令写一个Makefile可以和使用"go build -tags ..."做同样的事情并且支持更多的自定义,当然,保存你的工作。
例如:
将这些写在你的 go 文件中(例如 main.go):
define(DEBUG)
ifdef(`DEBUG',
fmt.Println("Debug message...");
)
将这些写入您的 Makefile 文件中:
all:*.go
mv main.go main.go.bak
m4 main.go.bak > main.go
go build
mv main.go.bak main.go
然后 运行 "make".
缺点:
- 你不能写一个名为 "define" 或 "ifndef" 等的函数,它会被 m4 翻译成 Macro。
- 如果您有很多文件,您可能需要改进 Makefile。
- 你可能想学m4,有点难,有点复杂
golang是否支持
#define DEBUG
#ifdef DEBUG
fmt.Println("Debug message...");
#endif
所以我可以构建一个运行时开销为零的调试版本?
Go 没有预处理器或宏系统。您可以做的是传入标签以通过 -tags
标志进行构建并使用构建约束。为此,您需要同一来源的两个版本,并且只有一个版本会根据标签是否存在而构建。
查看 https://golang.org/pkg/go/build/
中的构建约束main_debug.go
// +build debug
package main
import (
"fmt"
)
func main() {
fmt.Println("Debug build")
}
main_release.go
// +build !debug
package main
import (
"fmt"
)
func main() {
fmt.Println("Release build")
}
此处 go build
将使用 main_release.go 进行编译,而 go build -tags debug
将使用 main_debug.go
如果您在 linux 或 Mac 上工作,您可以尝试“m4" command.This 命令是一个 宏 处理器,正好适合这个问题。
在"go build"之前为运行m4命令写一个Makefile可以和使用"go build -tags ..."做同样的事情并且支持更多的自定义,当然,保存你的工作。
例如:
将这些写在你的 go 文件中(例如 main.go):
define(DEBUG)
ifdef(`DEBUG',
fmt.Println("Debug message...");
)
将这些写入您的 Makefile 文件中:
all:*.go
mv main.go main.go.bak
m4 main.go.bak > main.go
go build
mv main.go.bak main.go
然后 运行 "make".
缺点:
- 你不能写一个名为 "define" 或 "ifndef" 等的函数,它会被 m4 翻译成 Macro。
- 如果您有很多文件,您可能需要改进 Makefile。
- 你可能想学m4,有点难,有点复杂