【问题标题】:Do const if statements do the same thing as #ifdef macros in Go?const if 语句是否与 Go 中的 #ifdef 宏做同样的事情?
【发布时间】:2012-06-29 11:50:09
【问题描述】:

Go 中没有文本预处理。像 Java 和其他类似的,如果我想删除代码块,我可以使用 const 值并用 if 包围代码。

如果我这样做,编译器是否会优化来自 AST 和生成代码的代码?还是每次都执行条件?

编辑:如果我想复制 #ifdef 最好的方法是什么?

【问题讨论】:

  • 任何体面的编译器都会对此进行优化。不过,在构建 AST 的同时进行优化(就像 GCC 一样)将是愚蠢的。
  • 是的,但是 Go 编译器能做到吗?另外,优化 AST 有什么问题?

标签: go


【解决方案1】:

带有常量条件的If语句与#ifdef不同,因为里面的代码无论如何都会被编译。但是,编译器会尽可能优化它。考虑这个程序:

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     ,

死代码已经消失,所以它所做的只是返回。

如果您确实需要实际有条件地编译部分代码,最好通过构建系统来完成。

【讨论】:

  • 太好了,谢谢!但是什么构建系统?我在其中一个视频中看到了类似“为了使go build 变得简单,我们删除了您认为是构建系统的传统组成部分的大部分部分,例如文本预处理”。从您的回答来看,if 是正确的方法,但文本处理将是模拟#ifdef 的唯一方法,对吧?
  • 您可以通过 -tags 标志将标签传递给go build。然后,您可以通过在文件中放置 // +build tag// +build !tag 之类的内容来有条件地构建文件。请参阅此文档:golang.org/pkg/go/build
猜你喜欢
  • 2020-08-05
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 2020-10-25
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多