7

私はgoで1週間遊んでいますが、Cで見逃しているのはプリプロセッサマクロです。

パイプがファイルを通過するビルドスクリプトをハッキングする以外に、この機能を取得するために何を使用できますclang -Eか?

4

2 に答える 2

8

コメントで述べたように、ビルドフラグは、必要なものをすべて解決するためのおそらく最良の方法です。たとえば、一部の機能を開発でのみ使用できるようにする場合は、devフラグを使用します。

ファイルconstants_dev.go:

// +build dev
const DEVELOPMENT = true

ファイルconstants_pro.go

// +build !dev
const DEVELOPMENT = false

次に、コードで単純なを実行しますif DEVELOPMENT { blah... }。これはどのプリプロセッサよりもはるかに読みやすいと思います。ビルドフラグがたくさんある場合、これはかなり厄介になる可能性がありますが、その時点では、代わりにコマンドライン引数を使用する必要があります。

あなたのコメントの中で、あなたはコードの重複について言及しました。コードが本当に反復的である場合は、とにかくそれを関数に入れるか、反復的であるビットを再利用するためにコードを再構築する必要があります。個人的には、単純なブールチェック以外のものは、特にCスタイルのマクロでは、コードの保守が困難になることがわかりました。

ジェネリックでも同じです。私が使用した1つの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 に答える