3

私のコースインストラクターから、彼は繰り返し強調し、関数に「インライン」キーワードを使用しないように求めてきました。彼は、コンパイラ間で「移植可能」ではなく、「標準」でもないと述べています。これを考慮して、「インライン展開」を可能にする「標準」の代替手段はありますか?

4

4 に答える 4

18

あなたのコースインストラクターは間違っています。標準です。それは実際は現在の標準であり、セクション6.7.4 Function specifiers(C99)にあります。完全に無視される可能性があるのはコンパイラへの提案であるという事実は、それをそれほど標準的なものにするわけではありません。

一部の組み込みコンパイラが使用しているのはC89/90ではなかったと思いますが、その場合はアップグレードを真剣に検討します。

ただし、inline利用可能な場合でも、ほとんどの最新のコードはコードを最適化する最善の方法を理解できる以上の能力があるため、通常、これらの決定はコンパイラー自体に任せます(通常は私よりはるかに優れています)。andのinlineようなキーワードは、私が普段心配していることではありません。registerauto

代わりにマクロを使用できます。これは、通常、コンパイルフェーズの前に行われる比較的単純なテキスト置換ですが、制限と失敗に注意する必要があります。

または、手動でコードをインライン化する(つまり、複製する)こともできますが、これはすぐにメンテナンスの悪夢になる可能性があるため、オプションとしてはお勧めしません。

私自身は、これらのトリックを一切使用せずに通常の関数を使用してコードを記述し、必要に応じてそれらを紹介します(特定のパフォーマンスの問題など、それらが必要であることを示すことができる場合のみ)。

あなたは常にあなたのコードを維持しなければならないコーダーがあなたがどこに住んでいるかを知っている精神病の殺人者であると仮定するべきです:-)

于 2010-11-29T04:08:18.710 に答える
2

他の人が言っているように、 inline11年前にC標準に統合されました。

示された以外はinline、関数の可視性プロパティを変更するため、違いが生じます。特に、多くの関数のみが宣言されている大規模なライブラリの場合、すべてのstaticオブジェクトファイルにこれらの関数の1つのバージョンが含まれている可能性があります(たとえば、デバッグをオンにしてコンパイルする場合)。

その投稿を見てください:C99のインラインに関する神話と現実

于 2010-11-29T07:31:13.850 に答える
0

邪悪なことかもしれませんが、マクロは依然として王様です(ただし、特定のコンパイラーは追加の機能をサポートしている場合があります)。

于 2010-11-29T04:08:10.123 に答える
0

ここで、「コンパイラ間で移植可能」になりました。

#if (__STDC_VERSION__ < 199901L)
#define inline
#endif
static inline int foobar(int x) /* ... */

ちなみに、他の人が言っているように、inlineキーワードは単なるヒントであり、かなり役に立たないですが、重要なキーワードはstaticです。関数が宣言されていない限り、static外部リンケージがあり、コンパイラーは、インライン化する関数について独自の決定を行うときに、関数をインライン化の候補と見なす可能性はほとんどありません。

また、C ++とは異なり、C言語では。inlineなしでは許可されないことに注意してくださいstatic

于 2010-11-29T04:54:37.270 に答える