ヘッダーのマクロ関数と静的関数


9

関数を使用できる多くの簡単なタスクでf(x,y)は、プレーンCではマクロが使用されます。関数呼び出し(つまり、任意のコードのコード拡張ではなく、関数のインライン化に使用されるマクロ)で解決できるこれらのケースについて具体的に尋ねたいと思います。

他のCファイルからリンクされている可能性があるため、通常、C関数はインライン化されません。ただし、静的C関数は、それらが定義されているCファイル内からのみ表示されます。したがって、コンパイラーによってインライン化できます。多くのマクロは、より安全なコードを生成するため、静的関数に変換することで置き換える必要があると聞きました。

これが良くないケースはありますか?

繰り返しますが、##と同様に、関数としてまったく表現できない構造を持つコード生成マクロについては尋ねません。



適切なマクロを書くのはinline面倒です。関数をingするだけで、バイナリで複数回定義できるようになり、コンパイラーは実際にインライン化してスペースを節約するかどうかを決定できます
ラチェットフリーク

2
私は実際にこれらのほとんどが歴史的な理由だと思います。昔、Cコンパイラは関数をインライン化していませんでした。そのため、インライン化したいものにマクロを使用していました。Cコードは通常、長寿命です。
Jan Hudec 2013年

@ratchetfreak:Cにははありませんinline。これはC ++に関するものではありません。
wirrbel 2013年

2
@wirrbelもちろんinline、少なくともC99以降はCにもあります。概要については、インライン関数に関するウィキペディアを参照してください。
2013年

回答:


6

関数呼び出しで解決できるマクロには、多くの落とし穴があります。

  • のような引数を適切に処理する必要があるため、それらを書くのは難しいです++i
  • マクロをステップ実行したり、そこにブレークポイントを設定したりできないため、ビジュアルデバッガーでデバッグするのは困難です。
  • これらは、コンパイルの依存関係を分析するときに正しく処理するのが困難です。

関数呼び出しで解決可能なマクロは、プリミティブコンパイラーでインライン化を提供するのに役立ちました。インライン関数を処理しないコンパイラーについては知りません。コンパイル単位間でインライン化できるコンパイラーもあります。

他のCファイルからリンクされている可能性があるため、通常、C関数はインライン化されません。

コンパイラが従来のcalledとinlinedの2つのバージョンの関数を提供できない理由はありません。対象としているコンパイラのドキュメントをご覧ください。また、生成されたアセンブリを確認することもできます。アセンブリがわからなくても、いくつかの関数がインライン化されているかどうかをすばやく知ることができます。(これをすばやく学習するには、baby-examplesから始めます。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.