Go中沒有文本預處理。像Java和其他類似的,如果我想刪除一段代碼,我可以使用const
值,並用if
包圍代碼。做const if語句和Go中的#ifdef宏做同樣的事情嗎?
如果我這樣做,編譯器是否優化AST的代碼和生成的代碼?或者每次都執行條件?
編輯:如果我想複製#ifdef
最好的方法是什麼?
Go中沒有文本預處理。像Java和其他類似的,如果我想刪除一段代碼,我可以使用const
值,並用if
包圍代碼。做const if語句和Go中的#ifdef宏做同樣的事情嗎?
如果我這樣做,編譯器是否優化AST的代碼和生成的代碼?或者每次都執行條件?
編輯:如果我想複製#ifdef
最好的方法是什麼?
如果具有常量條件的語句與#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 ,
死代碼不見了所以它是所有的回報。
如果您確實需要實際上有條件地編譯部分代碼,最好通過構建系統來完成。
任何體面的編譯器都會優化這一點。雖然在構建AST時做優化(就像GCC一樣)將是無稽之談。 – 2012-06-28 21:12:56
是的,Go編譯器能做到嗎?另外,優化ASTs有什麼問題? – Joe