2011-03-11 138 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; 
} 

現在的問題是當編譯2個文件時,出於顯而易見的原因沒有問題,但是在鏈接時出現錯誤: main.cpp :(。text + 0x100):未定義引用'min(int,int)' 當我註釋行包含調用min()它的聲明它的作品。 現在,爲什麼在世界abs()正在工作,gcd()正在工作,但min()不是? 我正在使用g ++ in Linux

+1

從'abs'和'min'中刪除'inline'限定符gcd.cpp – 2011-03-11 11:46:23

+2

您是否聽說過縮進? – 2011-03-11 11:49:19

+0

您能否讓您的問題標題更具描述性?此標籤中的幾乎所有問題都是「關於CPP項目樣本」。 – 2011-03-11 11:50:29

回答

4

abs「works」,因爲它在標準C庫中作爲常規函數。你的自制軟件abs永遠不會從模塊中輸出,因爲它是inline

min也是如此,但是在標準庫中不可用,除非是template

我的建議是:導入<cstdlib><algorithm>,並用std::absstd::min代替。

+2

簡而言之,這是否意味着 - 內聯函數具有靜態鏈接? – Sadique 2011-03-11 12:06:30

+0

@Acme:是的。 http://www.parashift.com/c++-faq-lite/inline-functions.html#faq-9.6(「inline」關鍵字的意圖是用** no **鏈接來製作函數,即讓它們具有它們由編譯器而不是鏈接器進行內聯擴展。) – 2011-03-11 12:08:17

-1

Abs可能工作,因爲標準中有一個「abs」功能。您應該爲您的代碼添加標題和原型:目前,您的文件1忽略文件中存在的所有內容2.

+0

這些函數在'main.cpp'中用完全原型聲明。 'gcd'被正確導出。 – 2011-03-11 11:53:01

1

如果您只是想學習並希望看到自己的代碼需要abs,min,和gcd,你可以將它們重命名爲兩個文件中的「my_abs」,「my_min」和「my_gcd」,然後從聲明中刪除inline關鍵字。

例如:

// 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(我)在全球範圍內resoultion操作調用ABS /分鐘/ GCD但是,如果你是新的編程和公正。試圖獲得編寫代碼的感覺我認爲重命名函數是最簡單的方法讓你的腳溼潤