4

Goにはテキストの前処理はありません。Javaや他のJavaと同様に、コードのブロックを削除したい場合は、const値を使用してコードを。で囲むことができますif

これを行うと、コンパイラはASTから生成されたコードからコードを最適化しますか?または、条件は毎回実行されますか?

編集:複製したい場合#ifdef、それを行うための最良の方法は何ですか?

4

1 に答える 1

9

#ifdef内部のコードは常に何があってもコンパイルされるため、一定の条件を持つ if ステートメントは と同じではありません。ただし、コンパイラは可能な場合は最適化を行います。このプログラムを考えてみましょう:

package main

import (
    "fmt"
)

func main() {
    if false {
        fmt.Println("Hello, world!")
    }
}

を実行すると、関数go tool 6g -S test.goのアセンブリ出力は次のようになります。main

--- prog list "main" ---
0000 (test.go:7) TEXT    main+0(SB),$40-0
0001 (test.go:11) RET     ,

デッドコードはなくなったので、リターンするだけです。

コードの一部を実際に条件付きでコンパイルする必要がある場合は、ビルド システムを使用して実行することをお勧めします。

于 2012-06-29T03:50:09.703 に答える