96

マルチラインプリプロセッサマクロの作り方は?私は1行を作る方法を知っています:

#define sqr(X) (X*X)

しかし、私はこのようなものが必要です:

#define someMacro(X)
    class X : public otherClass
    {
         int foo;
         void doFoo();
    };

どうすればこれを機能させることができますか?

これは単なる例であり、実際のマクロは非常に長い場合があります。

4

7 に答える 7

143

\行継続エスケープ文字として使用します。

#define swap(a, b) {               \
                       (a) ^= (b); \
                       (b) ^= (a); \
                       (a) ^= (b); \
                   }

編集:@abelenkyがコメントで指摘したように、文字は行の最後の文字でなければなりませ\ん。そうでない場合(後で空白だけであっても)、その後の各行に紛らわしいエラーメッセージが表示されます。

于 2012-05-02T18:27:51.823 に答える
21

\各行の最後に円記号()を付けることにより、マクロを複数行にまたがらせることができます。

#define F(x) (x)   \
              *    \
             (x)
于 2012-05-02T18:29:31.433 に答える
19

Kerrek SBと共中毒者が指摘したように、受け入れられた回答で指摘されるべきであったことに 注意してください。常に、引数を中かっこで囲んでください。sqrの例は、CompSciコースで教えられている簡単な例です。

ここに問題があります:「sqr(1 + 5)」と言ったときに何が起こるかをあなたがしたように定義すると?「1+5 * 1 + 5」または11を取得します。
その周りに中括弧を正しく配置すると、#define sqr(x) ((x)*(x))
((1 + 5)*(1 + 5))または必要なものが取得されます36...美しい。

EdS.は「スワップ」で同じ問題を抱えています

于 2012-05-02T19:20:32.433 に答える
6

行末の改行を\:でエスケープしてエスケープする必要があります。

#define sqr(X) \
        ((X)*(X))
于 2012-05-02T18:30:03.907 に答える
2

これは元の質問の一部ではありませんでしたが、複数行のマクロに埋め込まれたコメントに注意が必要であると述べている回答は他にありません。

  • C ++スタイルのコメントは、行継続エスケープ文字を含む行には表示されない場合があります。
  • Cスタイルのコメントは、行継続エスケープ文字で区切られた複数行にまたがることはできません。

例:

// WRONG:
#define someMacro(X)          \
// This comment is a problem. \
class X : public otherClass   \
{                             \
     int foo;                 \
     void doFoo();            \
};

// WRONG:
#define someMacro(X)        \
/* This comment is also     \
 * a problem. */            \
class X : public otherClass \
{                           \
     int foo;               \
     void doFoo();          \
};

// OK:
#define someMacro(X)                \
/* This comment is fine. */         \
class X : public otherClass         \
{                                   \
     int foo; /* This is OK too! */ \
     void doFoo();                  \
};
于 2021-04-03T23:39:10.770 に答える
1

This is 2021 and we should really be moving towards inline. Incorrect, unnecessary and overuse of macros bloats the code and they are hard to debug ( read really hard to debug )

inline void foo(x)
{
   // do whatever with x
}

if, however macros are really the need of the hour, surrounding them with a do { } while(0); reason is explained in this post Why use apparently meaningless do-while and if-else statements in macros?

于 2021-04-04T02:56:05.643 に答える
0
于 2021-04-04T02:41:30.170 に答える