教授はクラスで、Java よりも C が好きな理由の 1 つは、C にはプリプロセッサ、特にマクロがあるからだと言いました。final
/const
変数を目的の値で宣言するよりも、マクロに利点はありますか? Java にはグローバル変数がないことは知っていますが、マクロの代わりに変数を使用しても機能しないという状況はありますか?
3 に答える
C でマクロ システムを使用することは長年の伝統であり、多くの場合、理解できないビルド チェーンや、非常にプロジェクト固有のビルド構成につながります。マクロが C に存在する理由は、マクロが提供するものが必要な場合の言語としての欠点を克服するためだと私は主張します (たとえば、Java でインターフェイスを使用すると、"何かの一般的な「インスタンス」)。
それでも、マクロ システムを使用する方が問題に簡単に適合するように見える場合があります。たとえば、API の複数の異なるバージョンをサポートする必要がある場合に、これを行うショップをいくつか知っています。通常、Java でのこの問題は、インターフェースを適切に使用し、設計に優れた抽象化レイヤーを使用することで解決できます。ただし、Java 用のマクロ システムが存在します。よろしければ、それらを使用できます。また、マクロに関する限り、C マクロはそれほど特別なものではないことに気付くかもしれません。
(私の意見では、あなたの先生は少し的外れでした...)
マクロ プリプロセッサを介して Java コードを実行できない理由はありません。言語の一部として行われていないだけです。
そうは言っても、マクロが C で価値がある理由のほとんどは C 言語の問題であり、マクロには多くの良い用途もありますが、ほとんどの人がそれらを使用することは非常に醜く、非生産的です。
いずれにせよ、一方にはマクロがあり、他方にはマクロがないという基準で C と Java を比較する人の専門知識には本当に疑問を感じます。大まかに言えば、それは言語間の最も些細な違いの 1 つに思えます。それを強調することは、その人が言語間の本当の違いを理解していないことを示唆しています。おそらく彼は C が好きですが、C が Java よりも優れている実際の機能 (保存期間や型の表現など) に名前を付ける方法を知りません。
Cのマクロは、単なるグローバル定数ではありません。また、次のような関数を定義することもできます
#define SHOW_DEFINE(x) printf("%s=%s\n", #x, STR(x))
これは、デバッグ中に非常に役立ちます。残念ながら、マクロで自分自身をひどく傷つけることも簡単です。
#define MULTIPLY(X,Y) X*Y
たとえば、MULTIPLY(1,2)は正常に機能しますが、予想される0 * 0の代わりにMULTIPLY(1-1,2-2)= 1-2 * 2-2 = 1-4-2を使用すると、問題が発生します。 。
通常、最新のツールでは、このような関数は不要になり、優れた設計と抽象化が行われ、Javaが提供するインターフェイスでは、通常、Javaにマクロを含める必要はありません。Javaは、自分自身を撃つことをできるだけ難しくするように設計されています。