C ++では、いつマクロを実行する必要があり ますか?ここの記事では、マクロが悪である理由、とにかくマクロを使用する理由について詳しく説明しています。#define
inline
私は1つを見る:
- 一部のコンパイラは、ループ付き関数のインリングをサポートしていません
他の?
また、マクロの一般的な使用法は何ですか。また、一般に、マクロが他の実装の選択肢に対して特権を持っているのはいつですか。
'inline'はコンパイラーへの単なるヒントであり、生成されたコードで関数をインライン化することを拒否することができます。
プリプロセッサマクロは単なる置換であるため、インライン化されることが保証されます。複製だけの関数はありません。
そうは言っても、マクロは依然として悪であり、それぞれのケースを「一般的なルール」ではなく評価する必要がありますが、一般的なルールが必要な場合は、常にマクロよりもインラインを優先するか、コンパイラがあなたよりも賢いことを信頼して決定させてください単独で。
マクロ(#define
)はプリプロセッサによって処理されます。これは、言語構文に関係なく、コンパイラーがソースを調べる前の、実際には単純な置換操作です。マクロパラメータに何らかの副作用がある場合、複数の評価の問題があります(例MACRO( x++ )
)。
関数はコンパイラーによって処理されます。適切な型チェックとスコープを提供し、複数の評価の問題を回避し、間違った場合にはるかに意味のあるエラーメッセージを提供します。
また、デバッガーを使用して「マクロインライン」関数をステップ実行しようとしたことがありますか?
それは機能です...ええと...5-っぽい、マクロはゼロです。
さて、inline
キーワードについては...インライン化すべきものとすべきでないものを決定する際にコンパイラーを実際に打ち負かすのに十分な能力があれば、この質問をすることはなかったでしょう。また、どこかでパフォーマンスの問題が発生した場合でも、どこかに追加するよりもはるかに効果的なことができる可能性が高くなりますinline
。
プリコンパイラマクロはいつでもテンプレートとインラインに置き換えることができます。インライン自体は、指定したタイプに制限されます。そのタイプが使用され、他には使用されません。テンプレートを使用すると、さまざまなタイプを利用して、コンパイルするものすべてに同じアルゴリズムを使用できますが、一部のタイプに特化しています。マクロの問題は、式を複数回評価できることです。テンプレート入力は関数に対して一度だけ評価されるため、テンプレートは決してそれを行うべきではありません。
STR(module)を使用して「モジュール」文字列を作成するなど、いくつかのことはマクロを使用した場合にのみ可能です。
インラインCマクロと旧式Cマクロの速度の比較についてはわかりません。これは非常にコンパイラ固有であり、コンパイラフラグを使用して多くの調整を行うことができると思います。私はそれをあまり遊んだことがなく、最近のコンパイラはインライン化できる関数を実際にインライン化するのに十分賢いと信じがちです。実際、コンパイラはそのようなキーワードがなくてもインライン関数を使用できるため、ほとんどの場合、インラインキーワードは必要ありません。