[解決済み] マクロを定義するときにdo while(0)を使うとどうなりますか?重複
2022-07-05 15:31:42
質問
重複の可能性があります。
C/C++ マクロにおける Do-While および if-else ステートメント
do { ... } while (0) - それは何のために良いのですか?
linux kernelを読んでいると、このようなマクロがたくさん出てきます。
#define INIT_LIST_HEAD(ptr) do { \
(ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)
単純に{}で定義するのではなく、なぜこれを使うのでしょうか?
どのように解決するのですか?
セミコロンでフォローし、より関数のように見せたり動作させたりすることができます。 また、if/else句を適切にその後で動作させます。
while(0)がなければ、上のコードは次のように動作しません。
if (doit)
INIT_LIST_HEAD(x);
else
displayError(x);
のように、マクロの後にセミコロンを付けると、else 節が "eat" となり、上記はコンパイルすらできません。
関連
-
コンパイルエラー:可変長オブジェクトが初期化されていない可能性があります。
-
[解決済み] c または c++ 用のシンプルな 2 次元クロスプラットフォームグラフィックスライブラリ?[クローズド]
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] マクロで無意味なdo-while文やif-else文を使っているのはなぜですか?
-
[解決済み] C言語でのブーリアン値の使用
-
[解決済み] CとC++でmain()は何を返すべきですか?
-
[解決済み] アセンブリがCより速いのはどんなとき?[クローズド]
-
[解決済み] なぜC言語では構造体を頻繁にtypedefする必要があるのですか?
-
[解決済み] Cの先頭の0を印刷する
-
[解決済み] for(;)」は「while(true)」より速い?もしそうでないなら、なぜ人々はそれを使うのでしょうか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] PTHREAD_MUTEX_INITIALIZER vs pthread_mutex_init ( &mutex, param )
-
[解決済み] なぜmemsetではなくbzeroを使用するのですか?
-
[解決済み] ソケットアクセプト - "開かれているファイルが多すぎる"
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] マクロで無意味なdo-while文やif-else文を使っているのはなぜですか?
-
[解決済み] mallocとcallocの違い?
-
[解決済み] なぜC言語では構造体を頻繁にtypedefする必要があるのですか?
-
[解決済み] ストラクチャーとユニオンの違い
-
[解決済み] do { ... } while (0) - 何のために良いですか?[重複]する
-
[解決済み】Cの複数行マクロ:do/while(0) vs スコープブロック [重複]。