質問

ようにしているの交換のマクロ-サブルーチンインライン機能をコンパイラの最適化し、デバッガのステップ実行することができなかった。いて定義として正常に機能す:

void do_something(void)
{
  blah;
}

void main(void)
{
  do_something();
}

だって定義としてインライン:

inline void do_something(void)
{
  blah;
}

void main(void)
{
  do_something();
}

というエラー:未定義の外部".そうするとどうなるでしょうか。かに刺し、暗てみました

static inline void do_something(void)
{
  blah;
}

void main(void)
{
  do_something();
}

となります。この機能の定義や呼び出し機能は同じです。cファイルです。

できる人に説明できない一つの作品にしない?

(関連する質問いいインライン機能が使いたいのですが、以上です。cファイルとは何ですか?)

役に立ちましたか?

解決

第一に、コンパイラは常にインライン機能としてマーク inline;例の場合において最適化とは考えにくいインラインです。

定義するときのインライン機能

inline void do_something(void)
{
  blah
}

この機能は、同じファイルのコンサルタントの機能により解決したリンカーをコンパイラでimplicitely"extern".この定義のみを提供しません外部の定義にしてください。

場のニーズに合わせてさまざまな宣言なし inline

void do_something(void);

Cファイルを見ることができるの inline 定義は、コンパイラを提供する外部の定義、機能、エラーに行くべきます。

その理由 static inline 作品はこの機能だけが見える内compilatioinユニットなどのコンパイラを解決するの呼び出し機能を最適化)を放出し、コードの機能が作成ユニットです。リンカーしない解決する必要がありません外部定義で設定します。

最高入力していただく部分にはすべてインライン機能はヘッダーファイルで宣言をしてい static inline.これを解除する必要が外部定義で解決したリンカーの問題です。しかし、これにより、コンパイラの排出をコードを機能毎に集計単位について研究を行っているので、このコード膨張.ですがその機能はインラインでも小さなもので、これは通常、な問題です。

その他のオプションを 定義 として extern inline ヘッダには、一つのCファイルを、 extern 宣言 なし inline を模倣しています。

イスマニュアルで説明している。

宣言機能インラインできない可能性があります。GCCさせたいと考えてい この機能になります。一方GCCを実現できることを この関数のコードのコードを、呼び出し側.この 実行速を廃止することにより機能の呼び架;に また、場合には実際の引数値は一定なのに対し、その 既知の値が許可起コンパイル時れることのないよう すべてのインライン機能コードのニーズが含まれていた。の影響 コードサイズが予想;オブジェクトコードを拡大または縮小 機能inliningよいことを証明しています。ができ また、ダイレクトGCCしてみると"シンプルな"機能を その呼び出し側のオプション -finline-functions.

GCCを実装し別の意味を宣言する機能 インライン.一が可能 -std=gnu89 または -fgnu89-inline または 時 gnu_inline 属性がすべてインライン宣言 他の場合 -std=c99, -std=c1x, -std=gnu99 または -std=gnu1x なし -fgnu89-inlineの第三の使用時に作成可能です。

を宣言する機能をインラインの使用 inline キーワードその 宣言のようになります:

 static inline int
 inc (int *a)
 {
   return (*a)++;
 }

を書いていてヘッダファイルに含まれるISO C90プログラム 書 __inline__ の代わりに inline.

の三種のinlining行動することになるため、同様に重要な場合:場合に inline キーワードを使用する static 機能のように、 上記の例では、機能は最初の宣言を使用せずに inline キーワードとして定義すると inline, このよう:

 extern int inc (int *a);
 inline int
 inc (int *a)
 {
   return (*a)++;
 }

するとともに、安全衛生面でも、普通の場合、プログラムの動作と同じ場合 た利用がない inline キーワードを除き、その速度です。

関連のイ static, 場合、すべての通話を 機能の呼び出し側の関数のアドレスが を利用したことのない、その機能は独自のアセンブラコードがない されます。この場合には、GCCない実際に出力アセンブラコード に機能しないかぎり、指定のオプション -fkeep-inline-functions.一部の話を統合することはできませんのための各種 理由(特に、騒音の発生メカニズムや騒音制御の機能の定義 を統合することはできませんが、できる再帰呼び出しの ません。がある場合nonintegrated、その機能 めのアセンブラコードとなります。の機能も 成は、通常の場合には、本プログラムには、そのアドレスが できないinlined.

しますので、ご注意使用方法、機能を定義することができるよう、そ 適用インラインに代入します。これらの用途:の利用 変数引数の使用alloca、可変サイズのデータの種類、計算後藤 用の非局所的五入れます。を使用 -Winline 警告を表示が機能付 inline な 置き換えていくことを理由に失敗。

としてISO C++、GCCと考えて会員機能を内で定義された 車体のクラスで目印になるインラインでもない場合は 明示的に宣言され、 inline キーワードとなります。をオーバーライドすることができるこ と -fno-default-inline.

GCCなインラインの機能はない場合に最適化しないと 指定し always_inline 属性のための機能は、このように:

 /* Prototype.  */
 inline void foo (const char) __attribute__((always_inline));

のその他残りの部分は特有のGNU C90inlining.

がインライン機能はありません static, そのコンパイル とがありうることからその他のソースファイル;以降、グローバル シンボル定義できるだけ一度にプログラムの機能はならない 定義されることになっているその他のソースファイルで電話をかけるとき 統合されます。そのため、非static インライン機能は常に ために、独自の通常のファッション。

指定した場合の両方 inlineextern の機能の定義 その後の定義を使用していinlining.いかなる場合には、 機能成分なものを参照すれば、そのアドレス を明確にした。などの住所が外部参照が使用している したが宣言された関数も定義されていないのです。

この組み合わせ inlineextern ほとんどの効果 クリックします。その使い方である関数定義ヘッダー ファイルキーワードから、他のコピーの定義 (足りない inlineextern)ライブラリファイルです。のの定義 のヘッダファイルが一番電話機能するinlined.する場合の機能は、参照のコピー の図書館があります。

他のヒント

為に inline C99で動作する機能(それらは言語に入っただけです)あなたはヘッダーファイルで定義を与える必要があります

inline void do_something(void)
{
  blah
}

とで 1 コンパイルユニット(別名.C)あなたは何らかの「インスタンス化」を配置します

void do_something(void);

なしで inline.

複数のファイルからそれらを使用する場合は、それらをヘッダーファイルに配置する必要があります。

また、リンカーエラーの場合:関数のデフォルトの宣言は、それが「extern」であることを意味しますが、インライン化されているため、リンカーはコンパイラ生成のシンボルスタブを見つけることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top