2016-08-16 1 views
0

私はいくつか古いCプログラムを維持しています。まったく同じパラメータを持つ関数(少なくとも10)では、プログラマはマクロを利用して同じパラメータを繰り返し入力することを避けました。ここでは、マクロ定義は次のとおりです。同じパラメータを持つ関数が多数ある場合は、パラメータを複数回入力するのを避けるためにマクロを使用する必要がありますか?

#define FUNC_DECL(foo) int foo(int p1, int p2, ....) 

私は同じパラメータで関数を定義したい場合はその後、私は唯一のタイプを必要とする:

FUNC_DECL(func1) 

同じパラメータを何度も入力するのは面倒な作業を回避することに加えて、この実装の他の利点はありますか?

このような実装では、少し混乱します。それの他の欠点はありますか?

このような実装は優れていますか?

+7

利点は、_do_の定義が同じ引数リストを持つことです。欠点は通常のCのようには見えないということです.10個のパラメータを構造体型(またはその2つ)にパッケージ化して、代わりに単純な関数インタフェースを作るのはなぜですか?全体として、マクロベースのスキームはそんなに好きではありませんが、時にはそれを使う十分な理由があります。これは境界線の例かもしれません。 –

+0

同じパラメータを持つ関数が少なくとも10個あります。現在、すべての関数は3つのパラメータ@ JonathanLeffler –

+2

ああ、3つのパラメータのみを持っていますか?マクロを使用するための言い訳はありません - 私はそれが10のパラメータだと思った。透明性はより重要です。私はコードがマクロを使用して明確になるとは思わない。とにかく余分なパラメータを使用するようにコードを変更しなければならない場合は、3つではなく4つのパラメータを使用する10の関数を変更する必要があります。それを離れて、その頭を離れて! –

答えて

4

メインの質問にコメントしたように、マクロを使用して同じ引数リストで関数を宣言すると、doの引数リストが同じであることが保証されます。

主な欠点は、通常のCのように見えないため、コードを読んでいる人は、その意味を理解するために、より多くのコードを検索しなければならないということです。

全体として、マクロベースのスキームは好きではありませんが、時にはそれを使用する十分な理由があります。これは境界線の例かもしれません。

同じパラメータで少なくとも10個の機能があります。現在、すべての関数には3つのパラメータしかありません。

ああ、パラメータは3つだけですか?マクロを使用するための言い訳はありません - 私はそれが10のパラメータだと思った。透明性はより重要です。私はコードがマクロを使用して明確になるとは思わない。とにかく余分なパラメータを使用するようにコードを変更しなければならない場合は、3つではなく4つのパラメータを使用する10の関数を変更する必要があります。入力の節約は関係ありません。マクロの意味を疑問視するために費やされる時間の節約は重要です。そして、コードをパズルする最初の人は、関数宣言の入力を保存するよりも時間を費やすことになります。

頭がおかしくなっています!マクロを削除します。あなたのコードを再び幸せにしてください。

1

#defineは、テキストプロセッサのようなものです。したがって、完全な関数宣言を書くか、プリプロセッサを使うかに関わらず、どちらも同じような実行時間で同じことを行います。 #defineを使用すると、プログラムを読みやすく/短くし、最終結果にはまったく影響しませんが、より多くの数の#defineは、より多くのコンパイル時間を意味します。しかし、一般的に、プログラムはコンパイルされた以上に使用されます。したがって、#defineの使用は、あなたの実稼働環境をまったく妨げません。

+1

マクロを使用するとプログラムが短くなりますが、可読性と保守性は犠牲になります。 'int main(){DO_STUFF(); } 'は読めるプログラムではありません。関数のようなマクロは、多くの理由で一般的に悪い習慣であり、避けるべきです。 – Lundin

+0

私はそれが読めるか、プログラムを短くするかもしれないと言った。どちらも同時に起こることもあれば、お互いに逆らうこともありますが、それはあなた次第です。マクロや関数を使用するかどうかにかかわらず、最初からプログラムをモジュール化した方が、メンテナンス性が向上します。 –

+0

機能的なマクロを使わない理由は何ですか?リンクなどを提供してください。 –

関連する問題