2012-06-28 58 views
4

Go中沒有文本預處理。像Java和其他類似的,如果我想刪除一段代碼,我可以使用const值,並用if包圍代碼。做const if語句和Go中的#ifdef宏做同樣的事情嗎?

如果我這樣做,編譯器是否優化AST的代碼和生成的代碼?或者每次都執行條件?

編輯:如果我想複製#ifdef最好的方法是什麼?

+0

任何體面的編譯器都會優化這一點。雖然在構建AST時做優化(就像GCC一樣)將是無稽之談。 – 2012-06-28 21:12:56

+1

是的,Go編譯器能做到嗎?另外,優化ASTs有什麼問題? – Joe

回答

8

如果具有常量條件的語句與#ifdef不相同,因爲無論如何都會編譯內部代碼。但是,編譯器會盡可能地優化它。考慮此方案:如果我們運行go tool 6g -S test.go

package main 

import (
    "fmt" 
) 

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

,這裏是爲main功能組件輸出:

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

死代碼不見了所以它是所有的回報。

如果您確實需要實際上有條件地編譯部分代碼,最好通過構建系統來完成。

+0

非常好,謝謝!但是什麼構建系統?我在其中一個視頻中看到,「爲了簡化構建」,我們刪除了大部分您認爲是傳統構建系統的一部分的部分,如文本預處理「。從你的回答中,'if'是正確的路線,但是文本處理將是模擬'#ifdef'的唯一方法,對吧? – Joe

+6

您可以通過-tags標誌將標籤傳遞給'go build'。然後,您可以通過在文件中放置諸如'// + build tag'或'// + build!tag'等條件來構建文件。請參閱此文檔:http://golang.org/pkg/go/build/ –

+0

謝謝!希望我可以給獎勵upvotes。 – Joe

相關問題