マクロとの比較
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/06/27 16:15 UTC 版)
C/C++にはテキストの置換機能としてマクロも備わっているが、型名の置換に使うには問題がある。まず、ポインタ型を正しく扱えない。 #define const_char_ptr_t const char *const_char_ptr_t s1 = "abc", s2 = "ABC"; // s2はconst char型となり、コンパイルエラーを引き起こす。 typedefであればポインタ型を正しく扱える。 typedef const char *const_char_ptr_t;const_char_ptr_t s1 = "abc", s2 = "ABC"; また、マクロは乱暴な置換を行なうことから、意図しない置換による原因特定のしにくいコンパイルエラーを引き起こすこともある。
※この「マクロとの比較」の解説は、「typedef」の解説の一部です。
「マクロとの比較」を含む「typedef」の記事については、「typedef」の概要を参照ください。
マクロとの比較
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/03/16 18:58 UTC 版)
古いC言語(C89)などでは、インライン展開をソースレベルの引数付きマクロで実現してきた。インライン関数はマクロに比べて次のような利点がある。 マクロ呼び出しは型チェックをしない。また、引数が正しい形式であるかもチェックしない。インライン関数呼び出しではこれらがチェックされる。 C言語のマクロは単なる文字列の置換であり、予期せぬ副作用や、引数の評価を複数回行ってしまうことによる弊害が生じることがある。インライン関数はそのような副作用をもたらさない。 マクロ内部でのコンパイルエラーは、マクロ展開後のコードで発生するため、プログラマにとっては理解が難しくデバッグに時間がかかることがある。インライン関数はコンパイラが処理するため、コンパイルエラーの発生個所および原因の特定もしやすい。 マクロ内では構文が制限され、通常とは異なった書き方を要求される。インライン関数は通常の関数と全く同じであり、インライン化するかどうかも自由に決定できる。 インライン化されたコードのデバッグ情報はマクロを展開したコードよりも扱いやすい。ブレークポイントの作成も可能である。 多くのコンパイラではある種の再帰呼び出し関数もインライン展開できる。再帰的マクロは一般に不正である。 これらの利点は、マクロを使用したジェネリックプログラミングに対する、C++の関数テンプレートのメリットと同様である。 C++の設計者ビャーネ・ストロヴストルップは、マクロよりもインライン関数を使うべきだと主張している。
※この「マクロとの比較」の解説は、「インライン関数」の解説の一部です。
「マクロとの比較」を含む「インライン関数」の記事については、「インライン関数」の概要を参照ください。
- マクロとの比較のページへのリンク