私のコースインストラクターから、彼は繰り返し強調し、関数に「インライン」キーワードを使用しないように求めてきました。彼は、コンパイラ間で「移植可能」ではなく、「標準」でもないと述べています。これを考慮して、「インライン展開」を可能にする「標準」の代替手段はありますか?
4 に答える
あなたのコースインストラクターは間違っています。標準です。それは実際には現在の標準であり、セクション6.7.4 Function specifiers
(C99)にあります。完全に無視される可能性があるのはコンパイラへの提案であるという事実は、それをそれほど標準的なものにするわけではありません。
一部の組み込みコンパイラが使用しているのはC89/90ではなかったと思いますが、その場合はアップグレードを真剣に検討します。
ただし、inline
利用可能な場合でも、ほとんどの最新のコードはコードを最適化する最善の方法を理解できる以上の能力があるため、通常、これらの決定はコンパイラー自体に任せます(通常は私よりはるかに優れています)。andのinline
ようなキーワードは、私が普段心配していることではありません。register
auto
代わりにマクロを使用できます。これは、通常、コンパイルフェーズの前に行われる比較的単純なテキスト置換ですが、制限と失敗に注意する必要があります。
または、手動でコードをインライン化する(つまり、複製する)こともできますが、これはすぐにメンテナンスの悪夢になる可能性があるため、オプションとしてはお勧めしません。
私自身は、これらのトリックを一切使用せずに通常の関数を使用してコードを記述し、必要に応じてそれらを紹介します(特定のパフォーマンスの問題など、それらが必要であることを示すことができる場合のみ)。
あなたは常にあなたのコードを維持しなければならないコーダーがあなたがどこに住んでいるかを知っている精神病の殺人者であると仮定するべきです:-)
他の人が言っているように、 inline
11年前にC標準に統合されました。
示された以外はinline
、関数の可視性プロパティを変更するため、違いが生じます。特に、多くの関数のみが宣言されている大規模なライブラリの場合、すべてのstatic
オブジェクトファイルにこれらの関数の1つのバージョンが含まれている可能性があります(たとえば、デバッグをオンにしてコンパイルする場合)。
その投稿を見てください:C99のインラインに関する神話と現実
邪悪なことかもしれませんが、マクロは依然として王様です(ただし、特定のコンパイラーは追加の機能をサポートしている場合があります)。
ここで、「コンパイラ間で移植可能」になりました。
#if (__STDC_VERSION__ < 199901L)
#define inline
#endif
static inline int foobar(int x) /* ... */
ちなみに、他の人が言っているように、inline
キーワードは単なるヒントであり、かなり役に立たないですが、重要なキーワードはstatic
です。関数が宣言されていない限り、static
外部リンケージがあり、コンパイラーは、インライン化する関数について独自の決定を行うときに、関数をインライン化の候補と見なす可能性はほとんどありません。
また、C ++とは異なり、C言語では。inline
なしでは許可されないことに注意してくださいstatic
。