2016-05-12 13 views
1

プログラミング言語:Cインライン関数は弱い記号を作成しますか?

私たちの仕事では、ヘッダーファイルheader1.hを持つプロジェクトがあります。このファイルには、(externを介して)外部スコープとして宣言され、同じヘッダファイル(header1.h)内でインラインとして定義された関数がいくつか含まれています。

このファイルは、異なるCファイルのいくつかの場所に含まれています。 GCCでの過去の経験で、複数の定義のエラーが発生することを理解しています。これが私が期待しているものです。しかし、私たちの仕事では、これらのエラーは発生しません。異なるのは、異なるコンパイラドライバを使用している点だけです。

私の過去の経験から、私が作っている最良の推測は、コンパイル時にシンボルが弱いシンボルとして生成され、リンカがその情報を使ってそれらの1つを選択していることです。

インラインとして定義された関数は、弱い記号になりますか?それが可能なのか、それとも別の理由があるかもしれません。

また、インラインで弱いシンボルが作成される場合は、それをオフまたはオンにする機能があります。

+0

いいえ、弱いシンボルはGNU拡張であり、 AFAIKでも定義されていません。 'inline'関数は特別なセマンティクスを持っています。スタックオーバーフローについてはここで調べることができます。 – Downvoter

+0

@Downvoter弱い記号は[ELF標準](https://en.wikipedia.org/wiki/Weak_symbol)の一部です:*弱い記号は、実行可能ファイルとリンク可能な形式(ELF)のオブジェクトファイルをリンクする際に特別に注釈を付けた記号を示します。 ... * –

+0

@AndrewHenleもちろん、私はCの標準を意味する、私はそれを書くのを忘れました。 ELF標準の一部であるため、GNU固有の拡張ではありませんが、標準とは独立して実装定義されています。 – Downvoter

答えて

1

関数がインラインである場合、関数本体が関数が使用されるたびに(通常のアセンブラ呼び出し/戻りセマンティックの代わりに)コピーされます。

(現代のコンパイラは、ヒントとしてインラインで使用しており、実際の結果は、それが使用されたすべてのコンパイル済みのファイルに一意のコピーで、静的関数であるかもしれない)

+0

ありがとうございます。しかし、「実際の結果はちょうど静的関数かもしれません」と言うとき、静的な記憶クラスを使用することを意味します。したがって、インラインvoid func1(void){}のような定義を持つ関数は、static void func1(void){}に置き換えられます。それはあなたが意味することですか? – user3750952

+0

はい。すべての静的関数とインライン関数、コンパイラはヒントと最適化フラグとしてソース内の入力を使用して、どのソリューションが最適かを選択します。少なくとも最も現代的なものです。 –

関連する問題