web-dev-qa-db-ja.com

複数行のDEFINEディレクティブ?

私は専門家ではないので、簡単に話してください。これら2つのコードセグメントに違いはありますか?

#define BIT3 (0x1
<
<
3)
static int a;

そして

#define BIT3 (0x1 << 3) static int a;

また、最初の行を1行で記述する方法はありますか?この複数行スタイルのポイントは何ですか?次のコードは良いですか?

#define BIT3 (0x1 << 3)
static int a;
49
Adam S

複数行マクロは、非常に複雑なマクロがあり、それがすべて1行にある場合は読みにくい場合に役立ちます(ただし、非常に複雑なマクロを使用することはお勧めできません)。

一般に、行継続文字\を使用して複数行の定義を記述できます。例えば.

#define MY_MACRO    printf( \
    "I like %d types of cheese\n", \
    5 \
    )

しかし、最初の例ではそれができません。そのようなトークンを分割することはできません。 <<左シフト演算子は常に空白を分離せずに記述する必要があります。そうしないと、2つの小なり演算子として解釈されます。かもね:

#define BIT3 (0x1 \
    << \
    3) \
    static int a;

これは2番目の例と同等です。

[そのマクロがどのように役立つかはわかりませんが!]

80

例えば:

#define fact(f,n)   for (f=1; (n); (n)--) \
                      f*=n;

行を\文字で区切ることができます。マクロ固有ではないことに注意してください。長い行を改行したいときはいつでも、コードに\文字を追加できます。

20
phoxis

最初のものは動作しません。行はバックスラッシュTHEN改行で区切る必要があります。そのようです:

#define SOME_MACRO "whatever" \
"more" \
"yet more"
6
Prof. Falken