これは、あなたが望むことを安全に行うと私が信じているマクロです:
#define EXIT_CIRCULATION() \
if (1) { \
/* some statements */ \
break; \
} \
else \
do {} while (0)
if
here が と一致するという事実はelse
、マクロが別の 内で安全に使用できることを意味しif
、else
句は do-nothing do
/ステートメントであるため、複数行のマクロを/while
でラップするのと同様のプロパティを提供します。マクロなどは、通常のステートメントであるかのようにセミコロンで終了する必要があります。セミコロンを忘れると構文エラーになります。そして、それは別のまたは節の中でうまく機能します。do
while
if
else
そして、あなたにとって最も重要なこと (私が思うに) は、break
ステートメントがマクロに飲み込まれないことです。マクロが使用されているループから抜け出します。
それが良いアイデアかどうかは、まったく別のことです。多くのプログラマーは、フロー制御ステートメントがマクロ内に隠されることを好みません (制御フローが完全にマクロ ユニット内にある場合を除きます)。
これが実際の動作です:
#include<stdio.h>
#include<stdlib.h>
#define EXIT_CIRCULATION() \
if (1) { \
puts("done."); \
break; \
} \
else \
do {} while (0)
int main()
{
int i = 0;
for (i = 0; i < 10; ++i) {
if (i > 4)
EXIT_CIRCULATION();
else
puts("working...");
}
printf("i == %d\n", i);
return 0;
}
出力:
working...
working...
working...
working...
working...
done.
i == 5