我已经玩了一个星期了,我错过了 C 语言中的预处理器宏。
除了破解管道传递文件的构建脚本之外,我还能用什么来获得这个功能clang -E
?
如评论中所述,构建标志可能是解决您需要的任何问题的最佳方法。例如,如果您希望某些功能仅在开发中可用,请使用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 的用途在很大程度上是无关紧要的。
我认为 cpp、m4 或任何可以满足您对 Go 进行预处理的愿望。是否是一个好主意是您的决定,但请注意,任何预处理都是采用任何已发布的 Go 代码的重大障碍。(例如,依赖于 makefile 的构建是同一个故事。)