web-dev-qa-db-ja.com

golangでのCスタイルの条件付きコンパイル

Golangのサポートはありますか

#define DEBUG 

#ifdef DEBUG 
  fmt.Println("Debug message..."); 
#endif 

それで、ランタイムオーバーヘッドがゼロのデバッグバージョンをビルドできますか?

16
can.

Goにはプリプロセッサやマクロシステムがありません。あなたができることは、-tagsフラグを介してビルドし、ビルド制約を使用するためにタグを渡すことです。これを行うには、同じソースの2つのバージョンが必要であり、タグが存在するかどうかに応じてビルドされるのは1つだけです。

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でコンパイルされます

29
aebudak

linuxまたはMacで作業する場合、「m4 "コマンドを試すことができます。このコマンドはマクロです。この問題にちょうど合うプロセッサー。

「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」を実行します。

不利益:

  1. M4によってマクロに変換される「define」や「ifndef」などの名前のgo関数を作成することはできません。
  2. 多くのファイルがある場合は、Makefileを改善する必要があります。
  3. 少し難しく複雑なm4を勉強したいかもしれません。
4
Hahahrf