[解決済み] do { ... } while (0) - 何のために良いですか?[重複]する
2022-03-26 06:03:19
質問
重複の可能性があります。
C/C++のマクロで無意味なdo/whileやif/else文があることがあるのはなぜですか?
その表現、もう10年以上前から見ていますよ。何のためにあるのか考えてみました。主に#definesで見かけるので、インナースコープの変数宣言と、(gotoの代わりに)breakを使うのに適しているのだと思います。
他に何か良いことがあるのでしょうか?あなたはそれを使いますか?
解決方法は?
C言語における唯一の構成要素である
#define
の中で使用することができます。
if
ステートメントを使用します。例題が参考になるかもしれません。
#define FOO(x) foo(x); bar(x)
if (condition)
FOO(x);
else // syntax error here
...;
中括弧を使ってもダメなんです。
#define FOO(x) { foo(x); bar(x); }
これを
if
文では、セミコロンを省略する必要があり、直感に反します。
if (condition)
FOO(x)
else
...
FOOをこのように定義すると
#define FOO(x) do { foo(x); bar(x); } while (0)
であれば、以下は構文的に正しいです。
if (condition)
FOO(x);
else
....
関連
-
[解決済み] mallocで文字列を確保する
-
[解決済み] stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み] C - Setデータ構造を実装するには?
-
[解決済み] for'ループでインデックスにアクセスする?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] 配列の反復処理に "for...in "を使用するのは、なぜ良くないのでしょうか?
-
[解決済み] C++でextern "C "を使用した場合の効果は?
-
[解決済み] C言語のコードで「:-!」とは何ですか?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Cエラー [エラー] 代入_Ashesの左オペランドにlvalueが必要です-プログラマーズ・シークレット
-
[解決済み] "break; "を "if "文から外す?
-
[解決済み] "static const" vs "#define" vs "enum"
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] マクロで無意味なdo-while文やif-else文を使っているのはなぜですか?
-
[解決済み] C言語でのブーリアン値の使用
-
[解決済み] C言語のi++と++iに性能差はあるのでしょうか?
-
[解決済み] C言語の構造体(CGRectやCGPointなど)をNSLog化することは可能ですか?
-
[解決済み] LD_PRELOADのトリックとは何ですか?
-
[解決済み】Cの複数行マクロ:do/while(0) vs スコープブロック [重複]。