7

我已经玩了一个星期了,我错过了 C 语言中的预处理器宏。

除了破解管道传递文件的构建脚本之外,我还能用什么来获得这个功能clang -E

4

2 回答 2

8

如评论中所述,构建标志可能是解决您需要的任何问题的最佳方法。例如,如果您希望某些功能仅在开发中可用,请使用dev标志:

文件常量_dev.go:

// +build dev
const DEVELOPMENT = true

文件常量_pro.go

// +build !dev
const DEVELOPMENT = false

然后在你的代码中,做一个简单的if DEVELOPMENT { blah... }. 我发现这比任何预处理器都更具可读性。如果您有很多构建标志,这可能会变得非常混乱,但此时您可能应该使用命令行参数。

在您的评论中,您提到了代码重复。如果您的代码确实如此重复,那么您可能应该将它放在一个函数中,或者可能重组代码以重用重复的位。就我个人而言,我发现除了简单的布尔检查之外的任何事情都会导致难以维护代码,尤其是对于 C 风格的宏。

这与泛型相同。在我使用过的一个 Java 库中,类签名是这样的:

class Thing<A, B, C, D, E>

该库的文档记录不是很好,因此我必须阅读大量代码(实现和使用该库的代码)才能了解发生了什么。

在 Go 中,该语言强制采用一种通常会导致更好的自记录代码的风格。我认为 Go 开发人员省略了诸如预处理器和泛型之类的东西,以避免编写难以维护但聪明的代码的诱惑。

我建议您在回顾以前使用的旧习语之前先尝试 Go 方式。我想你会发现大多数宏和#defines 的用途在很大程度上是无关紧要的。

于 2012-12-15T06:02:05.343 回答
5

我认为 cpp、m4 或任何可以满足您对 Go 进行预处理的愿望。是否是一个好主意是您的决定,但请注意,任何预处理都是采用任何已发布的 Go 代码的重大障碍。(例如,依赖于 makefile 的构建是同一个故事。)

于 2012-12-14T10:18:12.300 回答