18

#define Echo(a)  a
#define Echo(a) (a)

ここではおそらく大きな違いはないと思いますが、なぜaマクロ本体の中に括弧内を含めたいのでしょうか。それはどのようにそれを変えますか?

4

2 に答える 2

22

あなたが持っているとしましょう

#define mul(x, y)  x * y

私が言うとどうなりますか:

mul(a + 5, 6); /* a + 5 * 6 */

ここで、マクロを少し変更すると、次のようになります。

#define mul(x, y)  ((x) * (y))
mul(a + 5, 6); /* ((a + 5) * (6)) */

引数は評価されないことを忘れないでください。テキストによる置換のみが実行されます。

編集

マクロ全体を括弧で囲む方法の説明については、NateCKによって投稿されたリンクを参照してください。

于 2011-08-25T07:23:31.617 に答える
1

記録のために、マクロを使用しているときに数学的なエラーを修正する方法はここから着陸しました。この回答をここで展開して、その他の回答に合わせます。

あなたは次の違いについて尋ねています:

#define Echo( a )  a
#define Echo( a ) ( a )

マクロ自体を理解していない限り、これは問題ありません(私も専門家ではありません:))。

まず第一に、あなたはすでに (おそらく) Operator Precedence があることを知っているので、この 2 つのプログラムには大きな違いがあります:

1):

#include <stdio.h>
#define ADD( a , b ) a + b

int main( void )
{
    auto const int a = 5;
    auto const int b = 10;

    auto const int c = ADD (  2 + a ,  2 + b );
    printf( "%d", c );
    return 0;
}

出力:

19

と:

#include <stdio.h>
#define ADD( a , b ) ( a ) + ( b )

int main( void )
{
    auto const int a = 5;
    auto const int b = 10;

    auto const int c = ADD ( a , b );
    printf( "%d", c );
    return 0;
}

出力:

15

次に、前置+します*:

#define ADD( a, b ) a * b

コンパイラはa * b、たとえばa == 5b == 10whichのように扱い5 * 10ます。

しかし、あなたが言うとき: ADD ( 2 + a * 5 + b ) ここのように:

#include <stdio.h>
#define ADD( a , b ) ( a ) * ( b )

int main( void )
{
    auto const int a = 5;
    auto const int b = 10;

    auto const int c = ADD ( 2 + a , 5 + b );
    printf( "%d", c );
    return 0;
}

105演算子の優先順位が関係しており、

2 + b * 5 + a

なので

( 2 + 5 ) * ( 5 + 10 )

これは

( 7 ) * ( 15 )==105

しかし、あなたがするとき:

#include <stdio.h>
#define ADD( a, b ) a * b

int main( void )
{
    auto const int a = 5;
    auto const int b = 10;

    auto const int c = ADD ( 2 + a , 5 + b );
    printf( "%d", c );
    return 0;
}

あなたが得る37理由

 2 + 5 * 5 + 10

つまり:

2 + ( 5 * 5 ) + 10

つまり:

2 + 25 + 10

短い答え、次の間に大きな違いがあります:

#define ADD( a , b ) a * b

#define ADD( a , b ) ( a ) * ( a )
于 2018-02-10T17:13:06.500 に答える