web-dev-qa-db-ja.com

マルチラインプリプロセッサマクロ

複数行のプリプロセッサマクロの作成方法私は1行を作る方法を知っています:

#define sqr(X) (X*X)

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

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

これを機能させるにはどうすればよいですか?

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

62
noisy cat

あなたが使う \行継続エスケープ文字として。

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

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

100
Ed S.

マクロをバックスラッシュ(\)各行の最後:

#define F(x) (x)   \
              *    \
             (x)
15
Kerrek SB

ご注意ください Kerrek SBと共同依存者が指摘したように、それは受け入れられた答えで指摘されるべきでしたが、 常に 引数を中括弧で囲みます。 sqrの例は、CompSciコースで教えられている簡単な例です。

問題は次のとおりです。「sqr(1 + 5)」と言ったときに何が起こるかを定義した場合、 「1 + 5 * 1 + 5」または11を取得します
中括弧を正しく配置すると、#define sqr(x) ((x)*(x))
((1 + 5)*(1 + 5))または36 ...美しいものが得られます。

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

13
jiveturkey

\でエスケープすることにより、行末で改行をエスケープする必要があります。

#define sqr(X) \
        ((X)*(X))
3
codaddict