web-dev-qa-db-ja.com

Cのマクロと関数の違いは何ですか?

[〜#〜] c [〜#〜]のマクロと関数の違いは何ですか?マクロと関数を使用できるアプリケーションを1つ教えてください。

19
user615929

マクロの長所と短所

利点

  • 時間効率。
  • 関数のような引数を渡す必要はありません。
  • 前処理されています。
  • 読みやすい。

短所

  • 大きなコードではデバッグが非常に困難です。
  • 関数と比較してスタック内のメモリを増やします。プログラムで50回使用したマクロがあると仮定します。これは、メモリを50回消費しますが、関数が50回呼び出されると、そのメモリの割り当てを解除するたびに単一のメモリが使用されることを意味します
24
Varun Chhangani

基本的な違いは、関数がコンパイルされ、マクロが前処理されることです。関数呼び出しを使用すると、これらのすべてのスタック操作でASM CALLに変換され、パラメーターと戻り値が渡されます。 MACROを使用すると、Cプリプロセッサはマクロを使用してすべての文字列を変換し、コンパイルします。

マクロを使用することのマイナスは、実装を隠すことです。バグがあると、バグを見つけるのが難しくなります。

20

C(およびC++)では、マクロはプリプロセッサディレクティブです。これは、プログラムがコンパイルを開始する前に、すべてのマクロを通過して処理することを意味します。マクロは便利です

  • プログラムを読みやすくすることができます
  • コンパイル時に計算できるため、効率が向上します。
  • 頻繁に使用される長い式や複雑な式を短縮できます。たとえば、マクロを使用して現在のlog4cppロガーを取得し、別の数個を使用してさまざまなレベルで書き込みます。

欠点

  • 実行可能ファイルのサイズを拡大する
  • 注意しないと、名前空間があふれることがあります。たとえば、プリプロセッサマクロが多すぎる場合、コードで誤ってその名前を使用する可能性があり、デバッグが非常に混乱する可能性があります。

#define INCREMENT(x) x++

関数は、比較的独立して実行でき、特定のタスクを実行するコードです。数学関数のようなものと考えることができます。入力のセットが与えられた関数は特定の出力を与えます。 Cでは、これらは次のように定義されます。

<return type> <name>(<parameters>)
{
  //code body
}
11
Jim Jeffries

もう1つの違いは、機能にはスタックオーバーヘッドがありますが、マクロの場合はスタックオーバーヘッドがないことです。それは単なるコードの拡張です。

1
Ariful Hoque

マクロは単なるテキストの置換と考える必要があります。コード内にマクロが表示されるたびにマクロコードをインライン化するようなものです。これは「コードスニペット」に適しています。関数呼び出しのオーバーヘッドを回避できるからです。関数を呼び出すたびに、スタックにパラメーターをプッシュするための努力が必要になるからです。

1
Felice Pollano