2011-11-16 5 views
4

Iちょうどインライン関数のリンケージをテストするために、2つのファイルを作成し、最初の1インライン関数のリンケージの変更

#include <iostream> 
using namespace std; 
inline int f1(int a,int b){ 
    a=a+b; 
    while(a!=0) 
    a--; 
    cout<<"inline"; 
    return a; 
} 

秒1:

int main(){ 
    extern void f1(int a,int b); 
    f1(1,2); 
} 

G ++ frist.cc second.cc

リンカraiseエラーが発生しました。インライン関数がデフォルトであると予想しています内部結びつきは結果が正しいので。


しかし、私は最初のファイルにインライン関数の呼び出し機能を追加したとき:

#include <iostream> 
using namespace std; 
inline int f1(int a,int b){ 
    a=a+b; 
    while(a!=0) 
    a--; 
    cout<<"inline"; 
    return a; 
} 
int callf1(){ 
    f1(10,2); 
} 

、それが合格し、エラーなしで実行することができ、再びコンパイルので、私は持っていたもの尋ねたいですここで起こった? C++で

答えて

4

のですか?

コンパイラがインライン関数をコンパイルするとき、ヒューリスティックスの数と現在の最適化レベルに応じて、インライン関数をインライン化するかどうかを選択できます。 inlineは唯一の示唆であり、コンパイラは自由に無視することができます。

コンパイラは機能をインライン化しないようを決定した場合、複数のこのような定義が問題を起こさないように、それは弱い結合を持つ実際の関数定義を(関数はインラインで宣言されていなかったかのように)、(放出するには)。 そのは何が起こっているのか、なぜあなたのプログラムがリンクしているのですか?

最適化レベルを上げる場合、プログラムのリンクが停止する可能性があります。また、異なるインラインヒューリスティックを持つコンパイラを使用することもできます。

+0

インライン関数の呼び出し関数がある場合にウィークシンボルが追加されました。 '00000000 ** W ** _Z2f1ii' –

+0

g ++に' -O1'を追加すると、リンクが止まります。 –

4

インラインどこか、そうどこでも

C++ 7.1.2

インライン関数からはそれにすべての変換単位で定義されるものとすることが持っているとしての機能が定義されている場合使用されていると(3.2)

3.2は、一つの定義ルールを参照するすべての場合には、正確に同じ定義を有するものと

だから、何を経験していることは、ここで何が起こったか非C++標準の動作

+1

ok、私は-std = C++ 98を使用して再試行しますが、それでも...なぜですか? –

+0

C++ 98の9.2では...外部リンケージとインライン化の組み合わせが禁止されているため、コンパイラ作成者にとってはより簡単になります** –

関連する問題