2

以下は、半径が引数として渡されたときに円の面積を与える 2 つのプログラムです。しかし、最初のプログラムmacro.cではジョブにマクロを使用していますが、2 番目のプログラム function.c ではジョブに関数を使用しています。

私は関数の使用と、それが必要とするニュアンスに精通しています。しかし、引数を受け取るマクロの場合はどうでしょうか? 関数よりもそれらを優先する必要があるのはいつですか? そして、いつそれらを避けるべきですか?どちらがより良いパフォーマンスを提供しますか? マクロのアプローチでは、マクロがプログラムで何度も使用されるとコードがかさばることがわかっていますが、関数の場合は、ジョブに対して同じ関数が何度も呼び出されます。しかし、この些細な違いを超えて、私たちが注意する必要がある他の問題は何ですか?

//macro.c

#include<stdio.h>
#define AREA(x) (3.14*x*x)

int main(void)
{
    float r1=6.25,r2=2.5,a;

    a=AREA(r1);
    printf("\nArea of circle=%f",a);
    a=AREA(r2);
    printf("\nArea of circle=%f",a);
}


//function.c

#include<stdio.h>
float area(float);

int main(void)
{
    float r1=6.25,r2=2.5;
    printf("\nArea of circle=%f",area(r1));
    printf("\nArea of circle=%f",area(r2));
}

float area(float radius)
{
    return 3.14*radius*radius;
}
4

5 に答える 5

4

マクロの裏返しの数:

  • マクロを使用すると、タイプ セーフがすべて失われます。渡される引数は、関数の場合のように型チェックされませんinline
  • マクロは純粋なテキスト置換であるため、副作用が発生する可能性があります。
  • マクロが複数回評価され、エラーが発生する場合があります。

したがって、それらを避ける方が良いinlineです。代わりに関数を使用してください。

inline関数には、独自の裏返しがあります。

  • それらは、見たとおりであることを保証するものではありませんinlined

しかし、比較すると、inline間違いなくマクロよりも優れています。

于 2013-05-08T05:16:05.077 に答える
1

さらに追加します:)

->C では、マクロ呼び出しは型チェックを実行せず、引数が整形式であることのチェックさえも実行しませんが、関数呼び出しは通常実行します。

-> マクロは、その内部で呼び出された最後の式の結果以外のものを返すことはできません。

->C マクロは単なるテキスト置換を使用するため、引数と演算順序の再評価により、意図しない副作用と非効率が発生する可能性があります。

->マクロ内のコンパイラ エラーは、プログラマが入力したコードではなく、展開されたコードを参照するため、理解しにくいことがよくあります。

->多くの構文は、マクロを使用して表現するのが厄介または不可能であるか、または大幅に異なる構文を使用しています。

于 2013-05-08T05:49:17.060 に答える
0

マクロを使用するとパフォーマンスが向上しますが、コードが小さい場合に限られますが、関数に多くのことを実行させたい場合は、関数を使用することをお勧めします。このリンクの説明は十分に明確です

http://www.c4learn.com/difference-between-macro-and-function-in-c-programming.html

まだ疑問がある場合は、答えようとします

于 2013-05-08T05:18:58.420 に答える