2011-03-11 5 views
2

私は2つのファイルがあります:リンケージ

1はmain.cppに

#include<iostream> 
using namespace std; 

int min(int,int); 
int abs(int); 
int gcd(int,int); 

const char *s = "Read Error!!"; 

int main() 
{ 
    cout << "Enter first Value: "; 
    int i; 
    cin >> i; 
    while(!cin) 
    { 
    cout << s << endl; 
    cin >> i; 
    } 

    cout << "Enter second Value: "; 
    int j; 
    cin >> j; 
    while(!cin) 
    { 
    cout << s << endl; 
    cin >> j; 
    } 

    cout << "\nmin: " << min(i,j) << endl; 
    i = abs(i); 
    j = abs(j); 
    cout << "gcd: " << gcd(i,j) << endl; 
    return 0; 
} 

## 2は、今問題があるgcd.cpp
inline int abs(int iobj) 
{ 
    return iobj < 0 ? -iobj : iobj; 
} 


inline int min(int p1,int p2) 
{ 
    return p1 < p2 ? p1 : p2; 
} 


int gcd(int v1, int v2) 
{ 
    while(v2) 
    { 
    int temp = v2; 
    v2 = v1 % v2; 
    v1 = temp; 
    } 
    return v1; 
} 

です1が2つのファイルをコンパイルすると明らかな理由で問題はありませんが、リンク時にエラーが発生しています: main.cpp :(。テキスト+ 0x100):min(int、int)への未定義の参照 私はコメント行にmin()の呼び出しを含む文を書くときに機能します。 今、abs()が動作している理由は、gcd()は動作していますが、min()は??? 私はg ++のLinuxに使用しています。

+1

gcd.cppの 'abs'と' min'から 'inline'修飾子を取り除きます。 –

+2

あなたはインデントを聞いたことがありますか?あなたはあなたの足を濡らすための最も単純なアプローチです。 ? –

+0

あなたの質問のタイトルを少しわかりやすくすることができますか?このタグのほとんどの_every_質問は、 "サンプルCPPプロジェクトに関する"です。 –

答えて

4

abs通常の機能として標準のCライブラリに含まれているため、「動作します」。自家製のabsは、inlineであるため、モジュールからエクスポートされることはありません。

minでも同じことが起こりますが、これはtemplate以外の標準ライブラリでは利用できません。

私のアドバイス:<cstdlib><algorithm>をインポートし、代わりにstd::absstd::minを使用してください。

+2

簡単な言葉で言えば、それはインライン関数に静的リンケージがあることを意味するのですか? – Sadique

+0

@Acme:はい。 http://www.parashift.com/c++-faq-lite/inline-functions.html#faq-9.6( 'inline'キーワードの目的は、** no **リンケージで関数を作ることです。すなわち、それらを持つことですリンカーではなくコンパイラによってインライン展開されています)。 –

-1

stdに "abs"関数があるため、Absはおそらく動作しています。あなたのコードが機能するためのヘッダとプロトタイプを追加する必要があります:現在、ファイル1はあなたのファイルに存在するすべてを無視します2.

+0

関数は 'main.cpp'に完全なプロトタイプで宣言されています。 'gcd'は適切にエクスポートされます。 –

1

あなたが学びたいと思って、 gcdを使用すると、両方のファイルで "my_abs" "my_min"と "my_gcd"のように名前を変更して、宣言からインラインキーワードを削除することができます。例えば

// gcd.cpp 

// renamed abs to my_abs to avoid name collision with std library function. 
int my_abs(int iobj) 
{ 
    return (iobj<0?-iobj:iobj); 
} 

あなたは「:: ABS(I)のようなグローバルスコープresoultion操作を使用して、ABS /分/ GCDを呼び出すようないくつかの他のオプションを持っている。しかし、あなたがプログラミングに新しいしている場合だけ。

関連する問題