2010-05-05 83 views
0

爲什麼我無法編譯此代碼?extern(al)問題

//main 
    #include "stdafx.h" 
    #include "X.h" 
    #include "Y.h" 
    //#include "def.h" 

    extern X operator*(X, Y);//HERE ARE DECLARED EXTERNAL *(X,Y) AND f(X) 
    extern int f(X); 
    /*GLOBALS*/ 
    X x = 1; 
    Y y = x; 
    int i = 2; 

    int _tmain(int argc, _TCHAR* argv[]) 
    { 
     i + 10; 
     y + 10; 
     y + 10 * y; 
     //x + (y + i); 
     x * x + i; 
     f(7); 
     //f(y); 
     //y + y; 
     //106 + y; 
     return 0; 

    } 

//X 
struct X 
{ 
    int i; 
    X(int value):i(value) 
    { 
    } 
    X operator+(int value) 
    { 
     return X(i + value); 
    } 
    operator int() 
    { 
     return i; 
    } 
}; 
//Y 
struct Y 
{ 
    int i; 
    Y(X x):i(x.i) 
    { } 
    Y operator+(X x) 
    { 
     return Y(i + x.i); 
    } 
}; 

//def.h 
int f(X x); 
X operator*(X x, Y y); 
//def.cpp 
#include "stdafx.h" 
#include "def.h" 
#include "X.h" 
#include "Y.h" 


int f(X x) 
{ 
    return x; 
} 

X operator*(X x, Y y) 
{ 
    return x * y; 
} 

我收到錯誤消息:
錯誤2錯誤LNK2019:解析外部符號 「INT __cdecl F(結構X)」

錯誤3錯誤LNK2019:解析外部符號「結構X __cdecl操作者*(struct X,struct Y)「

另一個有趣的事情是,如果我將實現放在def.h文件中,它的編譯沒有錯誤。但那麼def.cpp呢?爲什麼我沒有得到err msg函數f(X)已經被定義?這裏不應該應用ODR規則。我擔心的第二個問題是,如果在def.cpp中將f的返回類型從int更改爲double,智能感知將此作爲錯誤強調,但程序仍編譯?爲什麼?

回答

1

只要刪除單詞extern。無論如何它是默認的 - 它不代表函數聲明的任何內容,並且在任何情況下都應該避免使用C++。如果你仍然有問題,可能def.cpp沒有被編譯到你的程序中。

+0

@Billy ONeal怎麼可能.cpp沒有被編譯? – 2010-05-05 15:41:54

+0

@Knowing:可以在項目屬性中設置爲Build:No,它可以不作爲項目的一部分包含在內,它可以與項目中另一個.cpp文件具有完全相同的名稱,這會導致編譯後的輸出被覆蓋,或Visual Studio可能會感到困惑,並認爲項目輸出在不是時是最新的。可能還有其他一些事情可能會出錯,但那些是我現在可以想到的。完全有可能使用'extern'賦予C鏈接功能,這也會導致鏈接器錯誤;因此我建議將其刪除。 – 2010-05-05 15:49:28

+0

我認爲他的意思是「沒有鏈接到」,可能還沒有被編譯。 – 2010-05-05 15:52:16

0

它看起來像def.cpp沒有在這裏使用。正如你指出的那樣,如果def.cpp被編譯,它包含了def.h,並且如果這些函數是在def.h中定義的,那麼這將是一個多重函數定義的警告或錯誤。

檢查您的項目設置。