2

次の関数構造をマクロに変換する方法を探しています。ばかげた無意味な例であることはわかっていますが、実際のソース コードを示すことができないため、要点を示しています。

int foo(int x, int y)
{
  do
  {
    --x;
    ++y;
  }while(x > y);

  return x * y; //note that x and y have changed values here.
}

そのため、メインの関数または他の関数を次のように呼び出すことができます。

int next_x = foo(x,y);

ここでは、構文が 100% 正しいとは思えません。これは私の貧弱な試みです:

#define FOO(x,y)      \
(                     \
  do                  \
  {                   \
    --x;              \
    ++y;              \
  }while(x < y),      \
  x                   \
)                     

最後のxの理由は、理論上、これを実行できるようにするためです。

int next_x = FOO(x,y);

しかし、代わりに構文エラーが発生し、その理由がわかりません。どんな助けでも大歓迎です。

===============================================

追加情報

それに応じて構造化された他のマクロがあることにも注意してください。

#define INIT(x,y)   
(   
  x = //something,
  y = //something
)

#define NEXT_INT(x,y)    \
(                        \
  INIT(x,y),             \
  get_next_num(x,y)      \            //Note, this is an inline function call , not a macro.
 )

#define NEXT_FLOAT(x,y,temp)         \
(                                    \
  temp = NEXT_INT(x,y),              \
  temp ? temp * 1.23456 : FLT_MIN    \
)                                    

そのため、私は次のことができます。

float my_flt = NEXT_FLOAT(x,y,temp);
4

3 に答える 3

2

ループを式として使用することはできないためdo/while、次のように括弧内にブロックを使用する必要があります。

編集:これは標準の C ではなく、GCC の拡張機能です。

#define FOO(x,y)    \
({                  \
  do                \
  {                 \
    --x;            \
    ++y;            \
  }while(x > y);    \
  x;                \
})
于 2013-07-25T19:12:40.020 に答える
0

ここでの問題の 1 つは、複数行のマクロ\では各行の最後に が必要なことです。

于 2013-07-25T19:08:02.650 に答える