0

まず - 私の下手な英語で申し訳ありません:-( 2番目 - 面白いタスクがあります。

#define ProvSetBit(reg, bit) (((reg) & (1<<(bit))) != 0)

チェックビットは非常に長くて読めない文字列になります:

ProvSetBit(SystemStatus[0], COMMAND_ON_DF);

#define COMMAND_ON_DF 0u

私はそれを変更したい:

ProvSetBit(COMMAND_ON_DF);

ここで、COMMAND_ON_DF:

#define COMMAND_ON_DF (SystemStatus[0], 0u)

またはそこに何か。しかし、うまくいきません。デバッガーの書き込み:「エラー [Pe054]: マクロ呼び出しの引数が少なすぎます」。あなたは私に何をアドバイスできますか?

4

1 に答える 1

3

関数が実際にインライン化されている場合、同じことを行うマクロよりも遅くなることはありません- それらは同一のアセンブリにつながります。また、投稿したコードと同じくらい簡単な関数は、インライン化されることがほぼ保証されています。マクロを捨てて、代わりに、コンパイラがインライン化を行っていない理由を調査する必要があります-おそらく、適切なコンパイルフラグを渡していませんか?

本当に、本当にこのマクロに固執したい/固執しなければならない場合は、Boost.Preprocessorを使用してこれを実現できます。

#include "boost/preprocessor/facilities/expand.hpp"

#define ProvSetBit(args) BOOST_PP_EXPAND(ProvSetBit_1 args)

#define ProvSetBit_1(reg, bit) (((reg) & (1<<(bit))) != 0)

#define COMMAND_ON_DF (SystemStatus[0], 0u)

int main()
{
  ProvSetBit(COMMAND_ON_DF);
}

実際の例

于 2013-10-25T12:51:24.380 に答える